Archive for category 编程技术

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

Erlang学习–输出MD5值

来源:http://www.ha24.cn/?p=197
Erlang输出的md5值是16位二进制的,就算转成list也和我们经常用的32位字符串不一样,这是转换代码:

  1. -module(md5).
  2. -compile(export_all).
  3.  
  4. md5(S) ->
  5.     Md5_bin = erlang:md5(S),
  6.     Md5_list = binary_to_list(Md5_bin),
  7.     lists:flatten(list_to_hex(Md5_list)).
  8.     
  9. list_to_hex(L) ->
  10.     lists:map(fun(X) -> ini_to_hex(X) end, L).
  11.     
  12. ini_to_hex(N) when N < 256 ->
  13.     [hex(N div 16), hex(N rem 16)].
  14.     
  15. hex(N) when N < 10 ->
  16.     $0 + N;
  17. hex(N) when N >= 10, N < 16 ->
  18.     $a + (N - 10).

,

No Comments

erlang学习–日期转为时间戳

看《Erlang程序设计》也有1周多了,也该开始动手了,最近几天会慢慢贴一些小模块上来。
先一个日期转为时间戳(1970-01-01 00:00:00到指定日期的秒数)

  1. -module(timestamp).
  2. -export([datetime_to_timestamp/1,timestamp_to_datetime/1]).
  3.  
  4. datetime_to_timestamp({Date, Time}) ->
  5.     Seconds1 = calendar:datetime_to_gregorian_seconds({Date, Time}),
  6.     Seconds2 = calendar:datetime_to_gregorian_seconds({{1970,1,1}, {0,0,0}}),
  7.     Seconds1 - Seconds2.
  8.     
  9. timestamp_to_datetime(Timestamp) ->
  10.     Seconds1 = calendar:datetime_to_gregorian_seconds({{1970,1,1}, {0,0,0}}),
  11.     Seconds2 = Timestamp + Seconds1,
  12.     calendar:gregorian_seconds_to_datetime(Seconds2).

,

No Comments

命令行下进行svn合并

平常进行SVN操作都直接在命令行下,当然合并也要在命令行下操作,SVN合并的命令是 svn merge,具体的帮助请用 svn merge –help查看。
用实例来说明吧:
主干: /trunk
某分支:/branches/1.02.05
现在要把1.02.05分支上的修改合并到主干上,步骤如下:
1.先查看1.02.05从哪个版本迁出的,当前版本是多少

svn log /branches/1.02.05 --stop-on-copy|vim -

假设得到的迁出版本是1000,当前版本是2000
2.进入主干版本,进行合并操作

cd /trunk
svn merge /branches/1.02.05 -r 999:2000

注意,这里起始版本要我们查询到的起始版本-1
在合并过程中少不了出现冲突的提示,看看哪个版本需要保留,哪个版本要删除,耐心解决。
最后用svn status查看影响了多少个文件,有可能出现有整个文件处于冲突状态,用svn resolved解决,再svn commit -m ‘message’ 提交,提交后注意测试看看有没有BUG。

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

[转载]可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks

phpchina上看到的,转过来,做个备忘。
可同时区分IE8、IE7、IE6、Firefox3、Firefox2的CSS hacks:

  1. color:/*\**/#00f\9; /* IE8 */
  2. }
  3. .test,
  4. .test:-moz-any-link{
  5.     color:#f60; /* Firefox2 */
  6. }
  7. .test,
  8. .test:default{
  9.     color:#000; /* Firefox3 */
  10.     *color:#f00; /* IE7 */
  11.     _color:#0f0; /* IE6 */
  12. }

可同时区分IE8、IE7、IE6、Firefox的CSS hacks:

  1. .test{
  2.     color:#000; /* Firefox */
  3.     color:/*\**/#00f\9; /* IE8 */
  4.     *color:#f00; /* IE7 */
  5.     _color:#0f0; /* IE6 */
  6. }

关于IE8的hacks:

  1. .test{
  2.     color:/*\**/#00f\9; /* IE8 only */
  3.     color:#00f\9; /* 适用于所有IE版本 */
  4. }

No Comments