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

2022-11-24 16:49:35 +08:00
 heguangyu5

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?

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

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

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

其实你可以知道里面干了啥的,第一步转译出的 scheme 代码是可读的.
Rache1
2022-11-25 09:32:15 +08:00
PSR-4 转成了 PSR-0 😂
lisxour
2022-11-25 10:53:45 +08:00
@heguangyu5 你们网站的证书都是有问题的。。。NET::ERR_CERT_COMMON_NAME_INVALID
lisxour
2022-11-25 11:03:14 +08:00
语法支持这个我不怀疑,但是你们所说的“尽可能和 PHP 兼容”,我是不太相信这个兼容度的,我在几年前就在用 peachpie 了(个人项目+公司项目级别的用,不是 demo 级别的用),而且也一直有在持续关注,在不开源的情况下,我只能严重怀疑你们是魔改自 php-src
heguangyu5
2022-11-25 11:59:28 +08:00
@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
2022-11-25 18:31:05 +08:00
牛逼!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/897626

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX