PHP 编译器 BPC 6.0 发布,支持 namespace,支持 closure,成功编译 workerman - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heguangyu5
V2EX    PHP

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

  •  
  •   heguangyu5 2022-11-24 16:49:35 +08:00 2746 次点击
    这是一个创建于 1051 天前的主题,其中的信息可能已经有所发展或是发生改变。

    release 地址: htps://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  
       2022-11-24 17:12:23 +08:00
    Zend Framework 1 有点古老了吧
    ywisax
        2
    ywisax  
       2022-11-24 17:50:40 +08:00
    swoole 推出了一个静态编译版的 swoole-cli ,打包了 PHP 和常用扩展,可以参考下
    xiaotianhu
        3
    xiaotianhu  
       2022-11-24 20:41:26 +08:00
    想支持一下
    www.bpc.dev 都打不开啊。
    haha512
        4
    haha512  
       2022-11-24 21:40:00 +08:00
    1. 不管是 github 还是官网,完全没有中文文档,这是主要面向国际化的项目?
    2. 像二楼所说的,参考 swoole-cli ,如果能完整支持 90% 以上甚至全部 php 功能,现有项目无需修改即可兼容运行,就完美了
    AngryPanda
        5
    AngryPanda  
       2022-11-25 08:13:09 +08:00 via iPhone
    不开源就没意思了,谁知道里面干了啥。
    heguangyu5
        6
    heguangyu5  
    OP
       2022-11-25 09:13:29 +08:00
    @ywisax
    @haha512

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

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

    其实你可以知道里面干了啥的,第一步转译出的 scheme 代码是可读的.
    Rache1
        9
    Rache1  
       2022-11-25 09:32:15 +08:00
    PSR-4 转成了 PSR-0
    lisxour
        10
    lisxour  
       2022-11-25 10:53:45 +08:00
    @heguangyu5 你们网站的证书都是有问题的。。。NET::ERR_CERT_COMMON_NAME_INVALID
    lisxour
        11
    lisxour  
       2022-11-25 11:03:14 +08:00
    语法支持这个我不怀疑,但是你们所说的“尽可能和 PHP 兼容”,我是不太相信这个兼容度的,我在几年前就在用 peachpie 了(个人项目+公司项目级别的用,不是 demo 级别的用),而且也一直有在持续关注,在不开源的情况下,我只能严重怀疑你们是魔改自 php-src
    heguangyu5
        12
    heguangyu5  
    OP
       2022-11-25 11:59:28 +08:00   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  
       2022-11-25 18:31:05 +08:00
    牛逼!
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2826 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 14:08 PVG 22:08 LAX 07:08 JFK 10:08
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86