PHP的Trim截取乱码

2014-07-22 11:33:05 查看评论 1097 人阅读    

一直使用Trim过滤首尾两端的字符串,关于Trim的官方描述:

trim — 去除字符串首尾处的空白字符(或者其他字符)


今天发现一个很奇怪的问题, 代码如下:

<?php
$str = '研发、产品、';
echo trim($str, '、');

猜下这个会返回什么?“研发、产品”?NO,这个居然很奇怪的返回了“研发、产��”。

难道是我的打开方式不对,怎么会返回乱码呢。


经过一番测试,发现一个很有趣的问题。

<?php
echo trim('abacabb', 'ab');   //print 'c'

原本以为这个会返回acabb的,但是居然只返回了c。这就是对trim函数的误解了。

其实这个在官方说明文档的Example是有的,只是我没注意看而已。


分类: PHP 标签: trim乱码

Golang遍历目录删除过期文件

2014-07-18 19:16:59 查看评论 1531 人阅读    

挺简单的一个遍历删除,直接上代码

package main

import (
	"fmt"
	"os"
	"path/filepath"
	"time"
)

const (
	DAY  = 10       //过期的天数
	HOUR = DAY * 24 //用于判断过期的小时数
)

func main() {
	path := "F:/test" //需要删除的路径

	//遍历目录
	err := filepath.Walk(path, 
	    func(path string, f os.FileInfo, err error) error {
		if f == nil { //获取文件数据为空则直接返回
			fmt.Println("Get FileInfo Nil: ", path)
			return nil
		}
		os.Chmod(path, 0777) //设置目录或者文件的可操作权限
		//判断文件的最后修改时间是否大于过期时间
		isExpired := int(time.Now().Sub(f.ModTime()).Hours()) > HOUR
		if !f.IsDir() && isExpired { //属于文件类型且已经过期则直接删除
			err := os.Remove(path)
			if err != nil {
				fmt.Println("Remove File Error:", err)
				return nil //删除失败仍旧继续
			} else {
				fmt.Println("Remove File: ", path)
			}
		}
		return nil
	})
	if err != nil {
		fmt.Println("Err:", err)
	}
}

代码附件:fileclear.rar


博客小升级

2014-07-11 12:10:24 查看评论 638 人阅读    

1405059858.png

博客在线编辑器终于支持上传功能了,赞一个!

目前还没发现支持golang后台上传的在线编辑器,所以只能自己动手了。

经过两个晚上终于把Ueditor的上传功能给弄好了。

分类: 随笔 标签: golang Ueditor

swfupload上传失败返回-300, RESIZE_ERROR

2014-07-09 12:50:45 查看评论 939 人阅读    

上传用的是swfupload插件,今天有几张照片死活传不上去,调试发现返回的errorCode为-300。

找到-300在SWFUpload.UPLOAD_ERROR中的RESIZE,Ps:很奇怪,网上很少看到有-300的错误说明,倒是有ERROR_RESIZE这个变量

RESIZE_ERROR - 当调整图像大小时出现了某错误啊


看到这个提示一头雾水,图片本身是没问题的。用PHP 的GD库是可以裁剪的。

后来将message信息打印出来发现如下:Error generating resized image. Resizing: Error #2015   

google 搜索发现这个是flash player的问题:

In AIR 1.5 and Flash Player 10, the maximum size for 
a BitmapData object is 8,191 pixels in width or height, 
and the total number of pixels cannot exceed 16,777,215 pixels. 
(So, if a BitmapData object is 8,191 pixels wide, 
it can only be 2,048 pixels high.) 

In Flash Player 9 and earlier and AIR 1.1 and earlier, 
the limitation is 2,880 pixels in height and 2,880 in width.
Starting with AIR 3 and Flash player 11, 
the size limits for a BitmapData object have been removed. 
The maximum size of a bitmap is now dependent on the operating system.


如上说明,图片的高宽不能超过8191px,然后总的像素值不能超过16777215px,总像素值计算为:height px * width px。

查看了下上传图片的px为:高度:5184px, 宽度:3456px。总像素值:5184*3456 = 17915904,这个值大于了flash player的限制了。


用ps打开图片修改下图片大小为:高度:4984px,宽度:3323px,总像素值:4984*3323= 16561832,刚刚好小于flash player的限制,上传,ok,没问题了。果然是这个限制的问题!


Ps:上面说flash player 11版本已经移除了这个限制,改为根据系统进行限制,但是不知道系统限制是如何计算的。反正我升级为flash player14上传也提示这个错误。

分类: PHP 标签: swdupload

【转】PHP-FPM进程CPU 100%的原因及解决方案

2014-07-02 17:51:42 查看评论 882 人阅读    

最近有服务器不时出现的CPU使用率超高,内存几乎被吃光,系统甚至自动kill掉一些进程,如sshd,vsftpd等。用top查看,PHP-CGI进程高挂不下,如下是解决方案:
一、进程跟踪
# top //找出CPU使用率高的进程PID
# strace -p PID //跟踪进程
# ll /proc/PID/fd //查看该进程在处理哪些文件
将有可疑的PHP代码修改之,如:file_get_contents没有设置超时时间。


二、内存分配
如果进程跟踪无法找到问题所在,再从系统方面找原因,会不会有可能内存不够用?据说一个较为干净的PHP-CGI打开大概20M-30M左右的内存,决定于PHP模块开启多少。
通过pmap指令查看PHP-CGI进程的内存使用情况
# pmap $(pgrep php-cgi |head -1)
按输出的结果,结合系统的内存大小,配置PHP-CGI的进程数(max_children)。


三、监控
最后,还可以通过监控与自动恢复的脚本保证服务的正常运转。下面是我用到的一些脚本:
只要一个php-cgi进程占用的内存超过 %1 就把它kill掉

#!/bin/sh
PIDS=`ps aux|grep php-cgi|grep -v grep|awk&rsquo;{if($4>=1)print $2}&rsquo;`
for PID in $PIDS
do
echo `date +%F&hellip;.%T`>>/data/logs/phpkill.log
echo $PID >> /data/logs/phpkill.log
kill -9 $PID
done


检测php-fpm进程
#!/bin/bash
netstat -tnlp | grep &ldquo;php-cgi&rdquo; >> /dev/null #2&> /data/logs/php_fasle.log
if [ "$?" -eq "1" ];then #&& [ `netstat -tnlp | grep 9000 | awk '{ print $4}' | awk -F ":" '{print $2}'` -eq "1" ];then
/usr/local/webserver/php/sbin/php-fpm start
echo `date +%F&hellip;.%T` &ldquo;System memory OOM.Kill php-cgi. php-fpm service start. &rdquo; >> /data/logs/php_monitor.log
fi

通过http检测php执行
#!/bin/bash
status=`curl -s &ndash;head &ldquo;http://127.0.0.1:8080/chk.php&rdquo; | awk &lsquo;/HTTP/ {print $2}&rsquo;`
if [ $status != "200" -a $status != "304" ]; then
/usr/local/webserver/php/sbin/php-fpm restart
echo `date +%F&hellip;.%T` &ldquo;php-fpm service restart&rdquo; >> /data/logs/php_monitor.log
fi


Ps:这个尚未进行验证,先保存在这里。

转自:http://blog.163.com/lgh_2002/blog/static/44017526201281212938679/

分类: Nginx/Apache 标签: PHP-FPM 监控