您好,欢迎访问一九零五行业门户网

关于PHP的编译和执行分离

作者: laruence( ) 本文地址: http://www.laruence.com/2012/08/16/2701.html 转载请注明出处 关于让php的编译和执行分离这个问题, 一直有人提, 也一直有人尝试. 提的人认为编译执行分离以后, 可以得到性能提升, 可以做代码保护等. 我本身并不是对这个特性很
作者: laruence()本文地址: http://www.laruence.com/2012/08/16/2701.html转载请注明出处 关于让”php的编译和执行分离”这个问题, 一直有人提, 也一直有人尝试. 提的人认为编译执行分离以后, 可以得到性能提升, 可以做代码保护等.
我本身并不是对这个特性很感冒, 因为这里面存在一个投入产出比. 让我来给大家解释一下, 然而不管怎么样, 在最后我会给大家提供一种方案来实现这个功能.
1. php的编译并不是很耗时
我之前的文章也介绍过, php的编译是线性的编译过程, 不做优化, 所以这个过程非常之快. 而编译和执行分离这个特性的提出着认为分离以后, 可以省掉编译过程, 会有很大的性能提升.
后记, 有同学提出, 编译和执行分离以后, 就可以在编译的时候做各种优化, 从而影响执行速度. 这个确实是个值得研究的方向.
2. 开发速度
php的一个优点就是开发/部署/调试非常方便, 快速, 更改立即见效, 这个当大家在十万火急的情况下修复线上bug的时候会感受更加深刻, 而如果我们采用了编译/执行分离以后, 那么更改就需要首先编译, 然后部署, 然后才能生效, 这对于开发来说, 并不是什么好事.
3. 我们有apc/zend o+等第三方的代码缓存工具
apc等第三方的代码缓存工具(opcodes cache)已经相对比较成熟, 并对开发者透明, 大家只要在服务器上安装了apc, 就可以得到编译/执行分离的性能提升.
4. 简单的编译/执行分离, 并不能很好的实现代码保护
原因很简单, php的编译不做优化, 所以很容易被反编译. 当然, 我也不否认, 采用二进制内容确实有一些作用.
另外, 还有一些因素, 比如编译/执行分离这个方案是有人在做的, 但是还不成熟等等.
最后呢, 其实我们目前也是可以做到的, 在这里我给大家提供一个类似的解决方案.
首先, 我要打个广告, 以后apc将由我来维护, 大家以后在apc的使用中如果有问题, 可以直接联系我.
回归正题: 要实现编译和执行分离, 其实我们借助apc就能做到, apc提供了一族apc_bin_dump, apc_bin_load函数, 能把opcodes缓存导出到外部文件中.
然而, 可惜的是, 这部分功能以前一直不能很好的正常工作, 这和之前的开发者因为时间原因不在投精力在这个上面是有关系的.
经过我对apc_bin系列函数的重新梳理, 修复以后, 这部分功能现在终于可以正常工作了(从apc-3.1.12开始), 那么基于这些函数, 我们就可以实现编译执行分离.
思路很简单, 在本地通过apc_bin_dumpfile把我们的php文件, 导出成bin文件, 然后在服务器上通过apc_bin_loadfile来读取这些bin文件. 就可以实现编译和执行分离啦, 一个简单的示意代码如下:
$ find ./ -name *.php -exec php -r apc_bin_dumpfile(array('{}'), array(), '{}' . '.bin'); \;
然后在服务器端的文件自动加载部分:
加载成功 但是报告 class 'a' not found 这是为什么啊2013/01/27, anonymous writes: 我用的时候遇到一个问题//t.phpclass a{ public b(){ return 'a'; }}//dump.phpapc_bin_dumpfile(array(dirname(__file__).'\t.php'),array(),'t2.bin');//test.php$res = apc_bin_load(file_get_contents('t2.bin'));var_dump($res);//exit;$c = new a();echo $c->b();加载成功 但是报告 class 'a' not found 这是为什么啊2013/03/05, php writes: 真的受教了,原来php也这么强大2013/04/28, yac (yet another cache) – 无锁共享内存cache | 午后小憩 writes: [...] 关于php的编译和执行分离 [...]2013/04/30, 再一次, 不要使用(include/require)_once | 午后小憩 writes: [...] 关于php的编译和执行分离 [...]2013/04/30, php & “data” url scheme | 午后小憩 writes: [...] 关于php的编译和执行分离 [...]2013/05/01, 关于php的编译和执行分离 | 午后小憩 writes: [...] 本文地址: http://www.laruence.com/2012/08/16/2701.html [...]2013/05/02, taint-0.3.0(a xss codes sniffer) released | 午后小憩 writes: [...] 关于php的编译和执行分离 [...]2013/05/15, accepting the things that happen to you in your life with grace and wisdom is a worthy goal. while we get into challenging situations often which test both grace and wisdom, the goal is to act and react gracefully as much as possible. it strengthens our c writes: foarte bine, e un pas inainte.2013/07/31, lein writes: 请教关于apc的使用bin_dump的文件怎么使用呢,网上找到的代码都不够详细,手册上也没有示例。我的代码:1 被dump的文件(/www/f1.php): '.chr(10);function dosome(){ echo date('y-m-d h:i:s');}2 执行dump的文件(/www/f2.php):
其它类似信息

推荐信息