开发者社区> 问答> 正文

PHP 的编译和执行分离,报错

关于让”PHP的编译和执行分离”这个问题, 一直有人提, 也一直有人尝试. 提的人认为编译执行分离以后, 可以得到性能提升, 可以做代码保护等。希望有大神帮忙解释下

展开
收起
一枚小鲜肉帅哥 2020-05-31 20:47:56 836 0
1 条回答
写回答
取消 提交回答
  • 菜不可及的程序猿
    1. PHP的编译并不是很耗时 我之前的文章也介绍过, PHP的编译是线性的编译过程, 不做任何优化, 所以这个过程非常之快. 而编译和执行分离这个特性的提出着认为分离以后, 可以省掉编译过程, 会有很大的性能提升
    2. 开发速度 PHP的一个优点就是开发/部署/调试非常方案, 更改立即见效, 而如果我们采用了编译/执行分离以后, 那么更改就需要首先编译, 然后部署, 然后才能生效, 这对于开发来说, 并不是什么好事
    3. 我们有APC/Zend O+等第三方的代码缓存工具 APC等第三方的代码缓存工具(Opcodes Cache)已经相对比较成熟, 并对开发者透明, 大家只要在服务器上安装了APC, 就可以得到编译/执行分离的性能提升. 比如编译/执行分离这个方案是有人在做的, 但是还不成熟等等 要实现编译和执行分离, 其实我们借助APC就能做到, APC提供了一族apc_bin_dump, apc_bin_load函数, 能把Opcodes缓存导出到外部文件中 经过我对apc_bin系列函数的重新梳理, 修复以后, 这部分功能现在终于可以正常工作了, 那么基于这些函数, 我们就可以实现编译执行分离 思路很简单, 在本地通过apc_bin_dumpfile把我们的php文件, 导出成bin文件, 然后在服务器上通过apc_bin_loadfile来读取这些bin文件. 就可以实现编译和执行分离啦, 一个简单的示意代码如下:
    $ find ./ -name "*.php" -exec php -r "apc_bin_dumpfile(array('{}'), array(), '{}' . '.bin');" \;
    然后在服务器端的文件自动加载部分
    <?php
        function __autoload($name) {
           /*首先计算出文件名字*/
           $file =  根据类名得到PHP文件路径();
           if (!file_exists($file)) {
              //文件不存在, 说明我们还没有load过, 那么创建一个空文件.
              file_put_contents($file, '');
              apc_bin_loadfile($file . '.bin');
           } else {
              //我们已经load过了, 理论上应该已经被服务器的APC缓存处理Cache住了.
            }
    
           include ($file);
       }
    当然, 这里只是一个简单的示意, 如果要实际使用, 你还要考虑缓存被换出的可能, 那么一个解决方案就是设置俩个自动加载函数, 第一个如上, 第二个如果被调用, 就说明缓存被换出, 导致include了一个空文件, 于是就再次load一次bin文件就可以了 当然, 你也可以把所有的文件打包到一个bin文件中, 然后只load一次, 后续就交给服务器上的APC Cache来做就可以了. 但是这里有一个要注意的点就是, 那么对于这部分希望代码保护功能的人来说, 就可以使用APC来免费的完成这些事情了. 不过, 这个方案确实有点丑陋, 后续可以考虑在APC上增加直接对bin文件的支持. 
    2020-05-31 20:56:17
    赞同 展开评论 打赏
问答分类:
PHP
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-直面PHP微服务架构挑战-高驰涛 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载