本来是发在长微博的,  不过, 鉴于, 好久没更新博客了......  就转过来,  凑个数吧,  大家凑合着看 🙂
    白忙活了近2个小时,不吐不快:
   一切要从今天下午5点左右说起, 调试一个扩展, 用valgrind(valgrind-3.8.1)做例行检查, 很不幸的valgrind报告invalid read:
最近我们的服务在升级php使用的libcurl, 期望新版本的libcurl支持毫秒级的超时, 从而可以更加精细的控制后端的接口超时, 从而提高整体响应时间.
   但是, 我们却发现, 在我们的CentOS服务器上, 当你设置了小于1000ms的超时以后, curl不会发起任何请求, 而直接返回超时错误(Timeout reached 28).
   原来, 这里面有一个坑,  CURL默认的, 在Linux系统上, 如果使用了系统标准的DNS解析, 则会使用SIGALARM来提供控制域名解析超时的功能, 但是SIGALARM不支持小于1s的超时, 于是在libcurl 7.28.1的代码中...
这个是我上周末在"阿里PHP技术沙龙"临时分享的一个主题的PPT, 主要是介绍一下Zend Optimizer Plus(简称O+).
    O+是由Zend公司开发的一个PHP性能提升工具, 在PHP5.5开始, 已经随着PHP的源代码一起发布了,  并且也改名为:Opcache.
    不同于APC, O+除了是Opcodes Cache以外,  还做了很多的Opcodes优化, 这个PPT就是主要列举了一下主要的优化们.
    也不同于eacc, O+做的优化更多一些.
这个PPT以前已经在微盘上分享过了,  今天突然想起来, 上传到了slideshare上, 顺便也在博客上留个纪念吧.
   这个PPT介绍了过去一年我在微博的工作成果, 包括Yaf的改, 以及新东西Yar, Yac等
   通过一系列的努力(整体方针是, 先提速, 降成本, 清晰架构, SOA), 我们让微博首页的响应时间下降了一倍多, 同时还降低了整体的成本.
首先,  太久不更新博客了, 容我先啰嗦几句.
    我一直以为人总是会挤出时间写博客的,  但现在看来我错了.  博客很久不更新, 倒不是说没有内容可以分享. 而是这一年来确实忙了很多, 本身工作上的事情就很多, 业余时间也被PHP项目上的事情, Zend的事情填满. 再加上一些小感悟也都在微博上牢骚了... 所以....
   Anyway, 很感谢各位经常来我博客的朋友,  不过我建议大家如果是提问的话, 不要在留言里, 有的时候会被博客当做SPAM, 有一些小问题,  可以来微博At我 @laruence
   言归正传,  今天分享个前天刚刚做的小工具, 代码可以在我的github上找到: php-valgrind.  这个工具主要是为PHP脚本提供了可以在脚本中开启Valgrind(严格说是Callgrind)的Profile能力.
关于PHP的浮点数,  我之前写过一篇文章: 关于PHP浮点数你应该知道的(All ‘bogus’ about the float in PHP)
     不过, 我当时遗漏了一点, 也就是对于如下的这个常见问题的回答:
<?php
    $f = 0.58;
    var_dump(intval($f * 100)); //为啥输出57
?>
     为啥输出是57啊? PHP的bug么?
     我相信有很多的同学有过这样的疑问, 因为光问我类似问题的人就很多, 更不用说bugs.php.net上经常有人问...
     要搞明白这个原因, 首先我们要知道浮点数的表示
好久没有更新blog了,  这一年来的工作确实很忙.....  anyway,  今天终于有新东西可以和大家分享.
     这个idea来自一个很简单的想法, 以及目前所遇到的一个机会.  首先我们来谈谈这个机会.
     在以前, 很多人都会选择使用APC,  APC除了提供Opcode Cache以外, 还会提供一套User Data Cache(apc_store/apc_fetch), 所以对于很多有需求使用User Data Cache的同学, 使用APC, 就没什么问题.
     然而, 最近Zend Optimizer Plus开源了, 测试表明, Zend O+在Opcode Cache方面, 因为做了Opcode Cache优化, 所以会比APC要高效,  再后来, PHP5.5已经把Zend O+作为了源代码的一部分. 会随着PHP一起发布.
     这就有了个问题, 对于那些既要使用Zend O+的Opcode Cache, 又要使用APC的User Data Cache的同学, 怎么办呢?
     开始的时候, 我只是给APC增加了一个开关apc.opcode_cache_enable,  这样一来, 用户就可以使用APC然而关闭opcode cache来达到这个目的,  但是APC的User Data Cache使用的存储机制是和Opcode Cache一样的, 这样的场景要求数据严格正确,  所以锁会比较多,  测试表明,  APC的User Data Cache的效率和本地memcached几乎相当.
     所以, 我想到了这个idea, 单独开发一个基于共享内存的, 高性能的User Data Cache
废话不多说, 直接看代码:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', "test");
$query = <<<query
  INSERT INTO `user` (`username`, `password`) VALUES (:username, :password);
QUERY;
$statement = $dbh->prepare($query);
$bind_params = array(':username' => "laruence", ':password' => "weibo");
foreach( $bind_params as $key => $value ){
    $statement->bindParam($key, $value);
}
$statement->execute();
请问, 最终执行的SQL语句是什么, 上面的代码是否有什么问题?
with 80 Comments上午的时候, 有同事来找我说上周新上线的一个使用mcrypt的脚本, 响应非常慢, 但是服务器的各项指标都正常, 不知道是什么原因.
    经过了解, 一个简单的可重现的脚本如下:
<?php $dmcryptText = "dummy"; $key = "foobar"; $size = mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($size); //注意这里 $m = mcrypt_ecb(MCRYPT_BLOWFISH, $key, $dmcryptText, MCRYPT_DECRYPT, $iv); var_dump($m);
     当20个并发请求这个脚本的时候, 我们会发现Apache的响应时间急剧上升...
     考虑到这个问题可能具有一定的普遍性, 于是我想我还是写一篇文章来介绍下这个坑, 防止后来人再次踩到.
After Yaf, there comes another PHP framework in extension(在Yaf发布以后, 又出现了一个PHP扩展的框架 Phalcon): Phalcon.
    then there raise a problem, which people have asked multi-times to me, that is , which one is the *fastest*(于是就出现一个问题, 不停的有人问, 到底Yaf和Phalcon哪个快, 因为他们都在他们的主页上宣称是最快的框架)?  Yaf, or Phalcon.  as they both declared they are the fastest(Yaf, Phalcon)