V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heguangyu5
V2EX  ›  PHP

PHP 编译器 BPC 6.0 发布,支持 namespace,支持 closure,成功编译 workerman

  •  
  •   heguangyu5 · 15 天前 · 1088 次点击

    release 地址: https://github.com/bob-php-compiler/bpc-release/releases

    使用指南: https://github.com/bob-php-compiler/bpc-release/wiki/01_Install

    不了解 BPC 是什么的可以翻看之前的帖子.

    简言之,BPC 可以将 PHP 代码最终转译成 C 语言,然后编译成动态链接库或者可执行程序.

    BPC 5.0 已经能够成功编译 Zend Framework 1 和我们公司自己的诸多项目.

    但要想更广泛的应用,还缺两个大特性:

    1. namespace
    2. closure

    1. 支持 namespace

    前些天看到 nikic/PHP-Parser文档, 发现 PHP 的 namespace 可以很容易地转化.

    于是就照着文档写了一个 phptobpc.php, 借助这个小程序,可以将使用 namespace 的 PHP 代码转为没有 namespace 的.

    当然 BPC 自身也做了相应的支持,这样动态调用也没问题.比如:

    <?php
    $classname = '\\Foo\\Bar\\Baz';
    $o = new $classname;
    

    我把这个程序打包成 phptobpc.phar, 下载回来 chmod +x 就能使用.

    2. 支持 closure

    BPC 之前就已经支持简单的匿名函数,比如:

    <?php
    $a = array(1,2,3);
    usort($a, function ($a, $b) { ... });
    

    BPC 6.0 完善了 closure 实现,支持 use,typehint,default value 等特性,比如:

    <?php
    $a = 1;
    $b = 2;
    $f = function (array $arg1, &$arg2, $arg3 = 1) use ($a, &$b) { ... };
    

    3. 成功编译 workerman

    之前有网友 @ywisax 评论说能不能把 workerman 整个编译起来.

    现在支持了 namespace 和 closure, 正好可以编译 workerman 试一试.

    由于编译后执行和 PHP 解释执行还是有一些区别,要想成功编译和运行,需要对 workerman 的代码做一些微调.

    整体来说,调整量很小.感兴趣的可以去查看 git commit .

    由于 workerman 没有 unit tests, 我们自己也没有 workerman 的项目,所以不好做完整的验证.

    但我照着 workerman 手册, 写了以下几个例子:

    1. start.php
    2. ws_test.php
    3. tcp_test.php
    4. SimpleChat.php
    5. BinaryTransfer.php
    6. TextTransfer.php

    运行起来,测试了一下,没有问题.

    start start -d stop restart status connections 这些命令都 OK.

    但是由于编译后只有一个二进制文件,reload显然是达不到预期效果的.

    这几个例子我都静态编译出来了,想动手试一下的直接 下载 回来 gunzip 然后 chmod +x 执行即可 (注意只能在 ubuntu 18.04 上运行).

    想自己动手编译的,参看 src/Makefileexamples/build.sh

    4. 几个常见问题?

    1. BPC 是否开源?

      BPC 是我们公司的内部项目,不打算开源.

      商业化策略还未确定,在正式商业化前,我们每次 release 都会带一个约 7 天的试用 license,如果过期了还想试用,只要给我们发个邮件我们就会再给 license.

      如果想要就此项目进行深度合作,可以发邮件到 YnBjQG91cmF0cy5jb20=

    2. BPC 和 VKCOM/kphp 以及 peachpiecompiler/peachpie 有什么区别?

      BPC 的目标是源码保护和软件授权(最终编译为 C),在此基础上尽可能和 PHP 兼容,也就是说,一个 php 脚本最好什么都不改就能编译成二进制.

      kphp 的目标是性能(编译为 C++),为此,它仅支持 limited subset of PHP, 参看 KPHP vs PHP differences

      peachpie 的目标也是性能(编译为 C#),同时将.NET 引进来了.

    3. BPC 和 Zend Guard, ionCube 以及 Swoole Compiler 有什么区别?

      Zend Guard, ionCube 和 Swoole Compiler 都是在 PHP opcode 的基础上进行源码保护的.

      BPC 应该来说和它们不是一类东西,只是目标相同罢了,BPC 和 kphp peachpie 算是一类.

    4. PHP 官方是否会做编译器?

      PHP 官方明确不做 Native AOT. 参看 Ahead of Time Compiler/AOT for PHP8?

    13 条回复    2022-11-25 18:31:05 +08:00
    CodeCodeStudy
        1
    CodeCodeStudy  
       15 天前
    Zend Framework 1 有点古老了吧
    ywisax
        2
    ywisax  
       15 天前
    swoole 推出了一个静态编译版的 swoole-cli ,打包了 PHP 和常用扩展,可以参考下
    xiaotianhu
        3
    xiaotianhu  
       14 天前
    想支持一下
    www.bpc.dev 都打不开啊。
    haha512
        4
    haha512  
       14 天前
    1. 不管是 github 还是官网,完全没有中文文档,这是主要面向国际化的项目?
    2. 像二楼所说的,参考 swoole-cli ,如果能完整支持 90% 以上甚至全部 php 功能,现有项目无需修改即可兼容运行,就完美了
    AngryPanda
        5
    AngryPanda  
       14 天前 via iPhone
    不开源就没意思了,谁知道里面干了啥。
    heguangyu5
        6
    heguangyu5  
    OP
       14 天前
    @ywisax
    @haha512

    由于 PHP opcode 可反编译的问题,要想真正保护源码就必须脱离 Zend 引擎.
    静态编译一个 PHP 并不是什么麻烦事,使用 PHP embed 都可以把 PHP 嵌入 C 程序,我们自己的项目也把 PHP 静态编译成.a 嵌入 vala 来做一些事情.

    不管是国际化还是国内化,还都没有展开做,我们有自己的项目,先把自己的项目做好,再说别的.
    heguangyu5
        7
    heguangyu5  
    OP
       14 天前
    @xiaotianhu 可能是你本地网络的问题,服务器不在国内.
    heguangyu5
        8
    heguangyu5  
    OP
       14 天前
    @AngryPanda 开源了会有另外一堆人说别的.

    其实你可以知道里面干了啥的,第一步转译出的 scheme 代码是可读的.
    Rache1
        9
    Rache1  
       14 天前
    PSR-4 转成了 PSR-0 😂
    lisxour
        10
    lisxour  
       14 天前
    @heguangyu5 你们网站的证书都是有问题的。。。NET::ERR_CERT_COMMON_NAME_INVALID
    lisxour
        11
    lisxour  
       14 天前
    语法支持这个我不怀疑,但是你们所说的“尽可能和 PHP 兼容”,我是不太相信这个兼容度的,我在几年前就在用 peachpie 了(个人项目+公司项目级别的用,不是 demo 级别的用),而且也一直有在持续关注,在不开源的情况下,我只能严重怀疑你们是魔改自 php-src
    heguangyu5
        12
    heguangyu5  
    OP
       14 天前   ❤️ 1
    @lisxour

    1. bpc.dev 用的是 Let's Encrypt 证书,我这边 Chromium/Firefox 都 OK,是哪个报 NET::ERR_CERT_COMMON_NAME_INVALID?
    2. 如果你亲自动手试一下的话,就会看到每次编译都会有一个.bpc-build-PID 的目录,里边有 bpc 生成的 scheme 代码,编译时加上相应参数也能看到 scheme 进一步生成的 c 代码,何来魔改 php-src?
    3. 关于兼容性,BPC 直接跑的是 php 的 phpt 测试,并且对 phpt 的更改必须在一个白名单中,参看 https://github.com/bob-php-compiler/bpc-php-7.2.19-tests
    limingxinleo
        13
    limingxinleo  
       14 天前
    牛逼!
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2885 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 11:37 · PVG 19:37 · LAX 03:37 · JFK 06:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.