Posts Tagged php
php的strtotime在处理am/pm时的一个BUG
今天在处理一个采集数据时发现采集到的时间是空的,到源网站看了一下,发现是有时间的。联想到之前一个am/pm的问题,然后就有了如下测试。
测试代码:
- $date = date('Y-m-d');
- $array = array('00:00am','00:00pm','00:01am','00:01pm', '01:01am','01:01pm','12:00am','12:00pm','12:01am','12:01pm');
- foreach ($array as $time) {
- echo $date . ' ' . $time.'<br />';
- echo strtotime($date . ' ' . $time).'<br />';
- echo date('Y-m-d H:i:s', strtotime($date . ' ' . $time)).'<br /><hr />';
- }
大家可以先自己想想预期的答案是什么,再往下看:
Read the rest of this entry »
UTF-8编码内简繁互转的PHP实现
昨天,因为项目需要对文字进行简繁互转,网上基本上是内码互转,即GB2312编码和BIG5编码之间的互转,我始终是UTF-8编码。关于UTF-8内的简繁互转,只有1篇,但被可耻的转了N次,占据了几页搜索页。我随便试了下,发现可以,等正式放到项目中才发现,只有一部分是正常的,只好自己想办法了。突然想到PHP的iconv函数,这是一个内码转换的函数,表面上看好像和我的需求不符,其实不然,我们可以通过曲线救国的方式来实现。先将UTF-8(简体字)转为GB2312编码,再将GB2312编码转为BIG5编码,然后再将BIG5转为UTF-8,这样比正常直接转多了2步,应该会有不少性能损失,具体损失多少,还没测试。到目前为止,还没有发现有不能转的字。下面放出代码:
- class ChineseTransfer {
- public static function big5_gb2312($in) {
- $in = iconv('UTF-8', 'BIG5', $in);
- $in = iconv('BIG5', 'GB2312', $in);
- $out = iconv('GB2312', 'UTF-8', $in);
- return $out;
- }
- public static function gb2312_big5($in) {
- $in = iconv('UTF-8', 'GB2312', $in);
- $in = iconv('GB2312', 'BIG5', $in);
- $out = iconv('BIG5', 'UTF-8', $in);
- return $out;
- }
- }
安装php-memcached,libmemcached提示“configure: error: “could not find memcached binary””的解决
先发一下牢骚,这些名字怎么这么接近,甚至是一样的。服务端:memcached,PHP客户端扩展:memcache,memcached,顺便想个别的名字不行吗,我想搜索关于php-memcached的资料,90%以上会搜索到服务端的memcached。
以下是正题。
如果memcached和php-memcached是在同一台机子里运行,一般不会出现这个问题,真出现了,只要加上”with-memcached=你的memcached路径”即可。
我这里碰到的情况是,memcached安装在另外一台机子,上面只有mysql和memcached。需要安装php-memcached的机器是没有memcached的,在安装libmemcached时,就会出现标题的报错,这时,只要从安装有memcached的机器那复制memcached放到本地的/usr/bin下即可顺利通过。
[转载]50点提高PHP编程效率
这些总结很 实用,希望给来我博客的人一点帮助。来源:Web思想者。
1、用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加上了双引号)。
2、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
3、$row[’id’] 的速度是$row[id]的7倍。
4、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。
5、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。
6、注销那些不用的变量尤其是大数组,以便释放内存。
7、尽量避免使用__get,__set,__autoload。
8、require_once()代价昂贵。
Read the rest of this entry »
[转载]从PHP5.2.x迁移到PHP5.3.x
php官方已经不再积极更新php5.2.x了,看到一篇文章讲从php5.2.x升级到php5.3.x的,先做个记录。目前的项目还是基于php5.2.x,时机成熟再迁移吧,毕竟这是劳民伤财的事。
来源:Web思想者论坛,以下为原文:
目录
一、PHP 5.3.x中发生了什么变化
二、向后不兼容的变化
三、新功能
四、Windows支持的变化
五、SAPI modules中的变化
六、PHP 5.3.x中不建议使用的功能
七、PHP 5.3.x中去除不推荐的功能
八、新参数
九、新函数
十、新的stream wrappers
十一、新的类常量
十二、新方法
十三、新扩展
十四、移除的扩展
十五、扩展中的其他变化
十六、新的类
十七、新的全局常量
十八、INI文件handling的变化
十九、其他变化
Read the rest of this entry »
xhprof自定义日志存放目录和文件名
用xhprof来分析PHP代码性能已经一段时间了,之前都按默认的配置,发现存放日志都要在同一个地方,文件名还是很不好识别的,极不方便,今天看了看xhprof的代码,发现这都可以配置的,罪过呀。
先POST一下原来的调用代码:
- $xhprof_random = mt_rand();
- if (function_exists('xhprof_enable') && $xhprof_random === 1) {
- xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
- }
- define('ROOT', dirname(__FILE__));
- // Your code here
- if (function_exists('xhprof_disable') && $xhprof_random === 1) {
- $xhprof_data = xhprof_disable();
- if (file_exists(ROOT . '/xhprof')) {
- require_once ROOT . '/xhprof_lib/utils/xhprof_lib.php';
- require_once ROOT . '/xhprof_lib/utils/xhprof_runs.php';
- $xhprof_runs = new XHProfRuns_Default();
- $xhprof_runs->save_run($xhprof_data, 'xhprof');
- }
- }
查看/xhprof_lib/utils/xhprof_runs.php,可以看到在new XHProfRuns_Default()时,可以传一个参数,该参数即是日志存放路径,在调用save_run方法时,可以传第三个参数来指定文件名,这样一来,在分析日志时,通过日志文件名就知道是哪个请求的,方便多了,新的代码:
- $xhprof_random = mt_rand();
- if (function_exists('xhprof_enable') && $xhprof_random === 1) {
- xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
- }
- define('ROOT', dirname(__FILE__));
- // Your code here
- if (function_exists('xhprof_disable') && $xhprof_random === 1) {
- $xhprof_data = xhprof_disable();
- if (file_exists(ROOT . '/xhprof')) {
- require_once ROOT . '/xhprof_lib/utils/xhprof_lib.php';
- require_once ROOT . '/xhprof_lib/utils/xhprof_runs.php';
- $xhprof_runs = new XHProfRuns_Default('../xhprof');
- $file_name = 'gateway_' . $_GET['action'] . '_' . microtime(TRUE);
- $xhprof_runs->save_run($xhprof_data, 'xhprof', $file_name);
- }
- }
php的一个判断值是否等于0的陷阱
先给一段代码:
- $a = 'Zero';
- $b = 0;
- if ($a == $b) {
- echo 'True';
- }
- else {
- echo 'False';
- }
我们预期的结果是False吧,但很遗憾,输出结果是True。
为什么会这样呢?原来是PHP在做字符串和数字进行比较时,会把字符串转为数字,如果字符串首字母不是数字或-时,会被转成0,然后杯具就发生了,解决办法有2种:
1、如果确定2边的值的类型就用===来代替==;
2、如果不确定,可以把在比较前做一下类型转换,确保等式2边的值类型一致。
这个问题是项目组一个同事发现的,做一下记录。
PHP 5下foreach引用导致程序出错
今天和同事在调试一段代码时,死活找不出哪里出错,后来一步一步找,在一个看似不可能出问题的地方出问题了,代码类似下面这样:
- $array1 = array(1, 2);
- $array2 = array(3, 4);
- foreach($array1 as &$item){
- }
- foreach($array2 as $item){
- }
- echo $array1[1];
这时得到的值是多少?我们想要的是2吧,但程序输出的却是4!
这是为什么呢?
在第一个循环完成后$array1[1] == $item,这时继续第二个循环,完成后就成了$array2[1] == $item == $array1[1],因为第一个循环是引用,所以在第二个循环后$array1[1] == $array2[1]。
一个教训,以后在使用临时变量时,2种办法至少要用上一种:
1、在使用临时变量前先unset(临时变量);
2、在用完临时变量后unset(临时变量);
ubuntu 9.04下安装xdebug和kcachegrind
本文假设读者已经安装好php及web服务器
1、编译安装xdebug
到http://xdebug.org/download.php下载对应的源码包,我下的是2.0.5;
- tar xvf xdebug-2.0.5.taz
- cd xdebug-2.0.5
可以查看README,为了方便一些同学,我把主要步骤贴出来
- /usr/local/webserver/php/bin/phpize
- ./configure --enable-xdebug --with-php-config=/usr/local/webserver/php/bin/php-config
- make
把生成的xdebug.so放到php的lib目录下
- cp modules/xdebug.so /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/
编辑php.ini,加入以下内容
- [Xdebug]
- zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
- xdebug.auto_trace=on
- xdebug.collect_params=on
- xdebug.collect_return=on
- xdebug.trace_output_name="%H.%s"
- xdebug.trace_output_dir="/data/logs/xdebug"
- xdebug.profiler_enable=on
- xdebug.profiler_output_dir="/data/logs/xdebug"
- xdebug.remote_port=8999
具体的配置可以参考:http://xdebug.org/docs/all_settings
注意:输出目录要预先建好,否则不会输出内容。
重启web服务器(或php-fpm)后,在phpinfo中查看是否有xdebug的信息,有的话就成功了。
2.安装kcachegrind
这个就容易多了
- sudo apt-get install kcachegrind
至此,你就可以用kcachegrind来分析你的PHP代码了。

近期评论