在PHP 5.4的更新list上, 有一句: 提升了Zend引擎的性能, 减少了内存占用.
那么, 到底是怎么提升的呢?
上个月, 终于算加入了PHP developer team, 一直以来最大的障碍就是语言, 现在想起来, 当年真应该更加认真努力的去学习英语.
得到的第一个任务是: 解决一个feature request, 请求在allow foreach($array as list($a,$b)
大意是说, 希望PHP能支持如下语法:
<?php
foreach (array(array(24,2333), array(31,4666)) as $k => list($a, $b)) {
printf("key:%s, a=>%s, b=>%s\n", $k, $a, $b);
}
/** output:
key:0, a=>24, b=>2333
key:1, a=>31, b=>4666
*/
实现这个功能, 入手点就是去改写PHP的语法分析逻辑, 具体的实现我会再后面附上对PHP5.4的patch.
从PHP5.3开始, zend_parse_paramters_*函数新增了如下几个新的类型描述符:
f - function or array containing php method call info (returned as
zend_fcall_info and zend_fcall_info_cache)
H - array or HASH_OF(object) (returned as HashTable*)
L - long, limits out-of-range numbers to LONG_MAX/LONG_MIN (long)
Z - the actual zval (zval**)
* - variable arguments list (0 or more)
+ - variable arguments list (1 or more)
这也使得我们做扩展开发的时候, 能更加轻松的处理输入参数, 得到想要的值.
其实一直想写这个系列, 但是一想到这个话题的宽泛性, 我就有点感觉无法组织.
今天我也不打算全部讲如何调试一个PHP的Core文件, 也不会介绍什么是Coredump, 选择一个相对比较简单的方向来介绍, 那就是如何从PHP的Core文件中获取一些对我们重演这个Core有帮助的信息.
上周的时候, 搞mysql proxy, 发现要用lua写服务器脚本, 加之以前配置lighttpd的时候, 配置也可以用lua来写, 就想彻底学习和研究下lua.
本着学习Lua的态度, 写了一个PHP扩展Plua, 把Lua解析器嵌入了PHP.
Lua的堆栈式传参, 很值得借鉴, 这点上, 感觉比PHP用一个结构体表示弱类型, 要来的更严格, 更可靠一些.
目前可以想到的应用场景, 是可以实现一种编写(Lua), 多处调用(C, PHP, Java等).
不废话了, 项目主页: Plua
代码在Google code上:http://code.google.com/p/plua/
本来觉得PPT里没什么东西, 犯不着放出来, 不是内容不丰富哈, 主要都是现场讲的内容.
不过, 既然有人要, 那就放到blog吧, 也当做留个念想.
总体来说, 这次峰会上, 我介绍了Ap(一个PHP扩展编写的PHP框架, 感兴趣的朋友可以看:Yaf-A PHP Framework Extension)在百度的应用.
如果在ubuntu/Debian下, 采用apt安装的PHP, 那么在使用Session的时候, 就可能会有小概率遇到这个提示.
PHP Notice: session_start(): ps_files_cleanup_dir: opendir(/var/lib/php5) failed: Permission denied (13) in /home/laruence/www/htdocs/index.php on line 22
以下是一些PHP Coding Tips. 当然, 这些Tips并不一定仅仅局限于PHP.
大家有什么好的心得, 欢迎直接回复本文与更多的人分享.. 谢谢
本文长期更新, 请关注PHP Coding Tips
最后更新: 2011/04/02
今天同事eddix告诉我发现一个PHP的warning,
$php --re dummy Warning: Internal error: Cannot find extension function Dummy in global function table in Unknown on line 0
以前没有遇到过, 不知道什么意思.
在上一篇文章Serialize/Unserialize破坏单例的最后, 我留下了一个问题, 为了让大家能思考, 我就单独再写一篇给出答案.