评论: 从最早听说Facebook搞一个神奇的项目开始, 我就在猜测它会怎么做? 想APC一样编译成Opcode? 或者是象phc从Opcode再次加工. 但, 今天看到的介绍, 让我还是有点出乎意料...哪就是- HipHop提供编译器, 让你可以"用PHP的语法写C++代码".
以下为转载原文:Facebook神秘的PHP项目HipHop for PHP终于揭开面纱。这个项目由一个PHP到C++的转换程序,一个重新实现的PHP运行库,和许多常用PHP扩展的重写版本构成,目的是旨在加速和优化 PHP。
41 search results for "opcode"
一个想当然造成的错误.
需求是这样的, 我需要给一个二进制流加入一个签名串. 那么首先, 理所当然我的写了一个签名函数, 考虑到要判断签名操作是否成功, 所以我采用了传引用:
function sign(&$carrier, $fingerprint) { if (NULL === $fingerprint) { return FALSE; } //加入签名 $carrier = 签名逻辑. return TRUE; }
接下来, 考虑到, 如果签名失败, 那还是使用原来的字符串做为结果, 所以, 我想当然的写下了如下的代码....
with 14 Comments对于PHP的中的数据来源, 不外乎有俩种:
1. 来自代码中 2. 来自外部(GET/POST/DB)
对于代码中的变量(也就是直接量)来说, 变量分配/赋值在编译期, 活跃在执行器, 在请求关闭期被销毁.对于这些变量来说, 使用APC进行Opcode缓存, 则会缓存这部分变量的值.
而对于来自外部的变量, 变量分配/赋值在编译器后, 执行期前, 在请求关闭期被销毁,对于这些变量来说, 使用APC进行OpCode缓存, 是不会被缓存的.
今天就着重关注下外部变量的一个部分,GET来的数据的整个生命周期....
今天有人问我isset和is_null啥区别,
看手册上讲的话, isset和is_null的功能几乎完全"相反的一样"..
是不是isset就是一个is_null的相反的别名?
诶, 要说区别, 那还真的是很多~
昨天环境迁移, 脚本出core, 因为之前的环境上运行正常, 所以初步认为是环境问题. 通过对core文件的分析, 初步发现原因和spl_autoload相关, backtrace如下:
#0 zif_spl_autoload (ht=Variable "ht" is not available.) at /home/huixinchen/package/php-5.2.11/ext/spl/php_spl.c:310 310 if (active_opline->opcode != ZEND_FETCH_CLASS) { (gdb) bt #0 zif_spl_autoload (ht=Variable "ht" is not available. ) at /home/huixinchen/package/php-5.2.11/ext/spl/php_spl.c:310 #1 0x00000000006a5da5 in zend_call_function (fci=0x7fbfffc100, fci_cache=Variable "fci_cache" is not available.) at /home/huixinchen/package/php-5.2.11/Zend/zend_execute_API.c:1052 .....
脚本很简单, 通过session_set_save_handler注册了一个类为session的user handler.
去掉spl_autoload以后, 不出core了, 但是每次都会抛出Class not found的异常, 可见core确实和spl_autoload有关, 但是这个Class ** not found的fatal error问题又和什么相关呢, 这个fatal error是否是导致spl_autoload core 的直接原因呢?
代码本身并没有任何问题, 对环境做了对比以后, 初步认定为新环境启用了APC的缘故.
在bug.php中找到了有人报告类似的bug(spl_autoload crashes when called in write function of custom sessionSaveHandler), 但没有任何一个人给出原因,或者解决的办法.
看来, 只能自己分析了....
从PHP5.1开始,PHP提供了用户对Zend VM执行分发方式的选择接口.
之前的文章中, 我也提过这方面的内容, Zend虚拟机在执行的时候, 对于编译生成的op_array中的每一条opline的opcode都会分发到相应的处理器(zend_vm_def.h定义)执行, 而按照分发的方式不同, 分发过程可以分为CALL, SWITCH, 和GOTO三种类型.
默认是CALL方式, 也就是所有的opcode处理器都定义为函数, 然后虚拟机调用. 这种方式是传统的方式, 也一般被认为是最稳定的方式.
SWITCH方式和GOTO方式则和其命名的意义相同, 分别通过switch和goto来分发.官方给出的描述说GOTO方式最快.
那么如果使用GOTO方式, 效率上到底能提高多少呢? 今天我就分别使用各种方式来测试一番:
经常会有人问我, PHP的数组, 如果用foreach来访问, 遍历的顺序是固定的么? 以什么顺序遍历呢?
比如:
<?php $arr[2] = 'huixinchen'; $arr[1] = 2007; $arr[0] = 2008; foreach ($arr as $key => $val) { //结果是什么? }
要完全了解清楚这个问题, 我想首先应该要大家了解PHP数组的内部实现结构.........
with 42 Commentswhy xdebug extension must be loaded as a zend extension?
what is zend extension and what are the differents between regular php extension and zend extension?
let's start from that the extension loading process.
我看到过很多人操作数组的时候, 对于数组中的非数字键名不使用引号,
$array[key] = $value;
我可以理解有些人可能会觉得这样的代码很"整洁", 并且也能正常执行.
更甚至,如果他很"幸运的"php配置的好:
error_reporting = ~E_NOTICE
他也许永远都沉浸在自己的"整洁"风格中, 看不到任何的NOTICE提示, 也不会意识到, 他这么做, 能损失多少的性能~
来, 我们一起来看看:
你知道怎么写出最快的循环么?
刚刚在晓东郭的blog看到一个有趣的问题" PHP中 $i++ 和 ++$i 的区别 ", 有趣的导致我做了下解答....
Can't find what you're looking for? Try refining your search: