Posts Tagged php

php的strtotime在处理am/pm时的一个BUG

今天在处理一个采集数据时发现采集到的时间是空的,到源网站看了一下,发现是有时间的。联想到之前一个am/pm的问题,然后就有了如下测试。
测试代码:

  1. $date = date('Y-m-d');
  2. $array = array('00:00am','00:00pm','00:01am','00:01pm', '01:01am','01:01pm','12:00am','12:00pm','12:01am','12:01pm');
  3. foreach ($array as $time) {
  4.     echo $date . ' ' . $time.'<br />';
  5.     echo strtotime($date . ' ' . $time).'<br />';
  6.     echo date('Y-m-d H:i:s', strtotime($date . ' ' . $time)).'<br /><hr />';
  7. }

大家可以先自己想想预期的答案是什么,再往下看:
Read the rest of this entry »

,

No Comments

UTF-8编码内简繁互转的PHP实现

昨天,因为项目需要对文字进行简繁互转,网上基本上是内码互转,即GB2312编码和BIG5编码之间的互转,我始终是UTF-8编码。关于UTF-8内的简繁互转,只有1篇,但被可耻的转了N次,占据了几页搜索页。我随便试了下,发现可以,等正式放到项目中才发现,只有一部分是正常的,只好自己想办法了。突然想到PHP的iconv函数,这是一个内码转换的函数,表面上看好像和我的需求不符,其实不然,我们可以通过曲线救国的方式来实现。先将UTF-8(简体字)转为GB2312编码,再将GB2312编码转为BIG5编码,然后再将BIG5转为UTF-8,这样比正常直接转多了2步,应该会有不少性能损失,具体损失多少,还没测试。到目前为止,还没有发现有不能转的字。下面放出代码:

  1. class ChineseTransfer {
  2.    
  3.     public static function big5_gb2312($in) {
  4.         $in = iconv('UTF-8', 'BIG5', $in);
  5.         $in = iconv('BIG5', 'GB2312', $in);
  6.         $out = iconv('GB2312', 'UTF-8', $in);
  7.         return $out;
  8.     }
  9.    
  10.     public static function gb2312_big5($in) {
  11.         $in = iconv('UTF-8', 'GB2312', $in);
  12.         $in = iconv('GB2312', 'BIG5', $in);
  13.         $out = iconv('BIG5', 'UTF-8', $in);
  14.         return $out;
  15.     } 
  16.  
  17. }

, ,

No Comments

安装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下即可顺利通过。

, , ,

No Comments

[转载]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 »

No Comments

[转载]从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 »

No Comments

xhprof自定义日志存放目录和文件名

用xhprof来分析PHP代码性能已经一段时间了,之前都按默认的配置,发现存放日志都要在同一个地方,文件名还是很不好识别的,极不方便,今天看了看xhprof的代码,发现这都可以配置的,罪过呀。
先POST一下原来的调用代码:

  1. $xhprof_random = mt_rand();
  2. if (function_exists('xhprof_enable') && $xhprof_random === 1) {
  3.     xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
  4. }
  5.  
  6. define('ROOT', dirname(__FILE__));
  7.  
  8. // Your code here
  9.  
  10. if (function_exists('xhprof_disable') && $xhprof_random === 1) {
  11.     $xhprof_data = xhprof_disable();
  12.     if (file_exists(ROOT . '/xhprof')) {
  13.         require_once ROOT . '/xhprof_lib/utils/xhprof_lib.php';
  14.         require_once ROOT . '/xhprof_lib/utils/xhprof_runs.php';
  15.         $xhprof_runs = new XHProfRuns_Default();
  16.         $xhprof_runs->save_run($xhprof_data, 'xhprof');
  17.     }
  18. }

查看/xhprof_lib/utils/xhprof_runs.php,可以看到在new XHProfRuns_Default()时,可以传一个参数,该参数即是日志存放路径,在调用save_run方法时,可以传第三个参数来指定文件名,这样一来,在分析日志时,通过日志文件名就知道是哪个请求的,方便多了,新的代码:

  1. $xhprof_random = mt_rand();
  2. if (function_exists('xhprof_enable') && $xhprof_random === 1) {
  3.     xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
  4. }
  5.  
  6. define('ROOT', dirname(__FILE__));
  7.  
  8. // Your code here
  9.  
  10. if (function_exists('xhprof_disable') && $xhprof_random === 1) {
  11.     $xhprof_data = xhprof_disable();
  12.     if (file_exists(ROOT . '/xhprof')) {
  13.         require_once ROOT . '/xhprof_lib/utils/xhprof_lib.php';
  14.         require_once ROOT . '/xhprof_lib/utils/xhprof_runs.php';
  15.         $xhprof_runs = new XHProfRuns_Default('../xhprof');
  16.         $file_name = 'gateway_' . $_GET['action'] . '_' . microtime(TRUE);
  17.         $xhprof_runs->save_run($xhprof_data, 'xhprof', $file_name);
  18.     }
  19. }

,

No Comments

php的一个判断值是否等于0的陷阱

先给一段代码:

  1. $a = 'Zero';
  2. $b = 0;
  3. if ($a == $b) {
  4.     echo 'True';
  5. }
  6. else {
  7.     echo 'False';
  8. }

我们预期的结果是False吧,但很遗憾,输出结果是True。
为什么会这样呢?原来是PHP在做字符串和数字进行比较时,会把字符串转为数字,如果字符串首字母不是数字或-时,会被转成0,然后杯具就发生了,解决办法有2种:
1、如果确定2边的值的类型就用===来代替==;
2、如果不确定,可以把在比较前做一下类型转换,确保等式2边的值类型一致。
这个问题是项目组一个同事发现的,做一下记录。

No Comments

PHP 5下foreach引用导致程序出错

今天和同事在调试一段代码时,死活找不出哪里出错,后来一步一步找,在一个看似不可能出问题的地方出问题了,代码类似下面这样:

  1. $array1 = array(1, 2);
  2. $array2 = array(3, 4);
  3. foreach($array1 as &$item){
  4. }
  5.  
  6. foreach($array2 as $item){
  7. }
  8. echo $array1[1];

这时得到的值是多少?我们想要的是2吧,但程序输出的却是4!
这是为什么呢?
在第一个循环完成后$array1[1] == $item,这时继续第二个循环,完成后就成了$array2[1] == $item == $array1[1],因为第一个循环是引用,所以在第二个循环后$array1[1] == $array2[1]。
一个教训,以后在使用临时变量时,2种办法至少要用上一种:
1、在使用临时变量前先unset(临时变量);
2、在用完临时变量后unset(临时变量);

,

3 Comments

ubuntu 9.04下安装xdebug和kcachegrind

本文假设读者已经安装好php及web服务器
1、编译安装xdebug
到http://xdebug.org/download.php下载对应的源码包,我下的是2.0.5;

  1. tar xvf xdebug-2.0.5.taz
  2. cd xdebug-2.0.5

可以查看README,为了方便一些同学,我把主要步骤贴出来

  1. /usr/local/webserver/php/bin/phpize
  2. ./configure --enable-xdebug --with-php-config=/usr/local/webserver/php/bin/php-config
  3. make

把生成的xdebug.so放到php的lib目录下

  1. cp modules/xdebug.so /usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/

编辑php.ini,加入以下内容

  1. [Xdebug]
  2. zend_extension="/usr/local/webserver/php/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
  3. xdebug.auto_trace=on
  4. xdebug.collect_params=on
  5. xdebug.collect_return=on
  6. xdebug.trace_output_name="%H.%s"
  7. xdebug.trace_output_dir="/data/logs/xdebug"
  8. xdebug.profiler_enable=on
  9. xdebug.profiler_output_dir="/data/logs/xdebug"
  10. xdebug.remote_port=8999

具体的配置可以参考:http://xdebug.org/docs/all_settings
注意:输出目录要预先建好,否则不会输出内容。
重启web服务器(或php-fpm)后,在phpinfo中查看是否有xdebug的信息,有的话就成功了。
2.安装kcachegrind
这个就容易多了

  1. sudo apt-get install kcachegrind

至此,你就可以用kcachegrind来分析你的PHP代码了。

, ,

No Comments

[转载]PHP的OOP思维导图

转自http://bbs.phpchina.com/thread-71198-1-2.html,原作者:blankyao

php的oop思维导图

php的oop思维导图

No Comments