PHP 编译器 BPC 6.2 发布,直接编译 PHP 文件为 web server!

2023-06-29 18:04:02 +08:00
 heguangyu5

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

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

apache2 mod_bpc

在 BPC 6.2 之前,要想发布 web 应用,需要将 php 文件编译成.so,然后由 BPC 提供的 apache2 module mod_bpc 加载,借由 apache 对外提供服务,详见 07_mod_bpc.

althttpd/althttpd-tls

Althttpd 是 https://sqlite.org/ 背后的 webserver, 其简介如下:

Althttpd is a simple webserver that has run the https://sqlite.org/ website since 2004. Althttpd strives for simplicity, security, and low resource usage.

As of 2022, the althttpd instance for sqlite.org answers about 500,000 HTTP requests per day (about 5 or 6 per second) delivering about 200GB of content per day (about 18 megabits/second) on a $40/month Linode. The load average on this machine normally stays around 0.5. About 10% of the HTTP requests are CGI to various Fossil source-code repositories.

详见 Althttpd: The Althttpd Webserver.

Althttpd 源码只有一个 c 文件,我们将其改造,然后将 BPC 最终转译出来的.c 和 althttpd.c 编译在一起,于是一个全新的 web server 诞生了!

如果编译时再加上 --static 选项,那么最终交付时,就一个可执行文件,包含了 web server + php 逻辑 + js/css/image 等静态资源, 非常便捷!

BPC Playground

BPC 官网 https://bpc.dev Try it Online ( BPC Playground ) 已经支持将合适的项目编译成 althttpd, 感兴趣的可以试一试!

2707 次点击
所在节点    PHP
25 条回复
vitovan
2023-06-29 18:26:52 +08:00
下一步就是 WebAssembly 了吧。
happy321
2023-06-29 22:16:54 +08:00
workerman 全是原生的 建议把这个的兼容性弄好一点? 把一项做精。
可以去 workerman.net 发帖 大家都需要这个工具
CodeCodeStudy
2023-06-30 09:11:49 +08:00
老哥能坚持下来不容易啊
heguangyu5
2023-06-30 09:56:25 +08:00
@happy321

BPC 已经成功编译了 workerman 和 GatewayWorker,并且我们自己基于 GatewayWorker 的聊天应用已经发布到了线上,bpc.dev 上的那个 online compiler 也是用 wokerman 做的.

但是普通的 web 项目和 workerman/webman 还是有区别的,编译成 althttpd 的 php 代码里,逻辑和使用 php-fpm 或者 mod_php 是一样的,exit/die 该怎么用就怎么用,echo/var_dump 也一样会显示在页面里,而不是终端上.

由于编译的关系,每次请求当然不需要解释 php 源码了,并且 class 的定义也可以做到只加载一次,相当于 workerman/webman 说的常驻内存了.

这样,我们可以正常写 php 页面,经 BPC 编译后,又能获得额外的一些好处.
rm0gang0rf
2023-06-30 10:38:05 +08:00
主流框架能编不
heguangyu5
2023-06-30 11:15:12 +08:00
@rm0gang0rf 举个例子,你想编译哪个框架?

能否编译一般考虑两方面:

1. 框架用到的 php 语言/语法特性 BPC 是否支持.

BPC 不支持 trait,generator,reflection.比如 thinkphp,我 grep 了一下 trait,发现 think-orm 目录下有一些文件用到了 trait,那么要想编译 thinkphp 可能需要的改动就要大一些.

2. 框架用到的扩展 BPC 是否已经实现了.

一般来说,BPC 的扩展开发相比 php 扩展要容易很多,所以扩展未实现不是什么大问题.但是如果框架用到的扩展 BPC 还没有实现,显然你自己编译不了.需要 BPC 实现了扩展之后才能编译成功.

其它的一般都是些小改动,比如__DIR__ __FILE__之类的.

另外,如果框架有比较完善的 phpunit 测试用例的话,会有非常好的质量保障.

以下几个项目可供参考,你可以浏览 git commit log,看下为了 BPC 编译需要做哪些调整:

1. https://github.com/bob-php-compiler/zf1
2. https://github.com/bob-php-compiler/bpc-workerman-4.1-branch
3. https://github.com/bob-php-compiler/bpc-GatewayWorker-3.x-branch
chenjia404
2023-06-30 11:24:07 +08:00
这个有没有使用案例呢?
heguangyu5
2023-06-30 11:37:18 +08:00
@chenjia404 目前整个 BPC 就我们自己的项目在用,之前都是 apache+mod_bpc 发布的,很快线上都会升级成 nginx + althttpd 形式的,毕竟只有一个文件,部署起来方便很多.

我们的项目大多是 toB 的,不方便分享.近期有一个刚上线的 toC 微信小程序"中实国际集团",你可以微信里搜一下,后端就是 BPC 编译的,在线聊天是 BPC 编译的 GatewayWorker/workerman.
jry
2023-06-30 13:54:21 +08:00
啥时候支持下 thinkphp 大佬
chenjia404
2023-06-30 13:56:11 +08:00
@heguangyu5 #8 感觉需要一些 to c 的用户,然后用户多了,就有更多人开发者参加。
heguangyu5
2023-06-30 14:30:06 +08:00
@jry 我没用 thinkphp 开发过项目,对 thinkphp 不熟.现在来说是要调整 thinkphp 的代码来让 BPC 编译成功.如果你手里有真实的项目需求,我可以提供一些帮助.
love51money
2023-06-30 14:40:18 +08:00
支持 BPC ,应该出一个小白的入门教程,这样可以吸引更多的开发者,毕竟,PHP 是最好的语言,数量众多。🐶
jry
2023-06-30 15:02:41 +08:00
@heguangyu5 thinkphp 有 trait 不支持,需要去修改 thinkphp 源码吗?
learningman
2023-06-30 15:07:26 +08:00
wordpress 能工作吗,这种运行时有插件的应该跑不了吧
heguangyu5
2023-06-30 15:10:47 +08:00
@jry

除了非常简单的 php 程序,不可避免都要进行一些修改,毕竟编译后是一个二进制包括了所以逻辑,编译前是分目录和文件的.

不过我看 https://github.com/top-think/framework 只有 tests 里有一个 trait, 当然 think-orm 里多一些.
但是简单的情况下, trait 就是在 use 的位置插入 trait 的代码而已, 所以调整起来应该还好.
jry
2023-06-30 15:13:58 +08:00
@heguangyu5 改源码怕不稳定,话说 23 年是 AOT 元年啊,springboot/dotnet 都出 AOT 了,再也不用缓慢的运行时,PHP 官方跟进下就好了。
mrpzx001
2023-06-30 15:14:16 +08:00
比 static-php 多了代码保护的作用?
heguangyu5
2023-06-30 15:20:16 +08:00
@learningman

没有尝试编译过,但应该没问题. 插件可以编译成一个个的.so, 然后调用 dl()函数加载进来.
因为 BPC 的目标是源码保护,而不是性能,所以 php 的动态特性该有的都实现了.
happy321
2023-06-30 15:25:36 +08:00
kphp 的 mysql redis 都要重新开发,你这个是直接使用原生的吗?
大佬 能不能自己实现服务器,类似 swow workerman libuv 那样,既能加密又能引入一些高并发的东西
heguangyu5
2023-06-30 15:25:47 +08:00
@mrpzx001 BPC 的核心目标是两个,一是源码保护,二是软件授权.

另外 BPC 重新实现了 php 的 runtime 和每一个扩展函数,部署出去时,服务器上是没有 php 运行环境的,就相当于是 C 写的程序,只不过是 php 转译的.但是从外部看,所有表现都很像 php.

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

https://tanronggui.xyz/t/952783

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

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

© 2021 V2EX