不了解 BPC 是什么的可以翻看之前的帖子.
简言之,BPC 可以将 PHP 代码最终转译成 C 语言,然后编译成动态链接库或者可执行程序,实现 PHP Native AOT.
在 BPC 6.2 之前,要想发布 web 应用,需要将 php 文件编译成.so
,然后由 BPC 提供的 apache2 module mod_bpc 加载,借由 apache 对外提供服务,详见 07_mod_bpc.
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 官网 https://bpc.dev Try it Online ( BPC Playground ) 已经支持将合适的项目编译成 althttpd, 感兴趣的可以试一试!
1
vitovan 2023-06-29 18:26:52 +08:00
下一步就是 WebAssembly 了吧。
|
2
happy321 2023-06-29 22:16:54 +08:00 via iPhone
workerman 全是原生的 建议把这个的兼容性弄好一点? 把一项做精。
可以去 workerman.net 发帖 大家都需要这个工具 |
3
CodeCodeStudy 2023-06-30 09:11:49 +08:00
老哥能坚持下来不容易啊
|
4
heguangyu5 OP @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 编译后,又能获得额外的一些好处. |
5
rm0gang0rf 2023-06-30 10:38:05 +08:00
主流框架能编不
|
6
heguangyu5 OP @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 |
7
chenjia404 2023-06-30 11:24:07 +08:00
这个有没有使用案例呢?
|
8
heguangyu5 OP @chenjia404 目前整个 BPC 就我们自己的项目在用,之前都是 apache+mod_bpc 发布的,很快线上都会升级成 nginx + althttpd 形式的,毕竟只有一个文件,部署起来方便很多.
我们的项目大多是 toB 的,不方便分享.近期有一个刚上线的 toC 微信小程序"中实国际集团",你可以微信里搜一下,后端就是 BPC 编译的,在线聊天是 BPC 编译的 GatewayWorker/workerman. |
9
jry 2023-06-30 13:54:21 +08:00
啥时候支持下 thinkphp 大佬
|
10
chenjia404 2023-06-30 13:56:11 +08:00
@heguangyu5 #8 感觉需要一些 to c 的用户,然后用户多了,就有更多人开发者参加。
|
11
heguangyu5 OP @jry 我没用 thinkphp 开发过项目,对 thinkphp 不熟.现在来说是要调整 thinkphp 的代码来让 BPC 编译成功.如果你手里有真实的项目需求,我可以提供一些帮助.
|
12
love51money 2023-06-30 14:40:18 +08:00
支持 BPC ,应该出一个小白的入门教程,这样可以吸引更多的开发者,毕竟,PHP 是最好的语言,数量众多。🐶
|
13
jry 2023-06-30 15:02:41 +08:00
@heguangyu5 thinkphp 有 trait 不支持,需要去修改 thinkphp 源码吗?
|
14
learningman 2023-06-30 15:07:26 +08:00 via Android
wordpress 能工作吗,这种运行时有插件的应该跑不了吧
|
15
heguangyu5 OP @jry
除了非常简单的 php 程序,不可避免都要进行一些修改,毕竟编译后是一个二进制包括了所以逻辑,编译前是分目录和文件的. 不过我看 https://github.com/top-think/framework 只有 tests 里有一个 trait, 当然 think-orm 里多一些. 但是简单的情况下, trait 就是在 use 的位置插入 trait 的代码而已, 所以调整起来应该还好. |
16
jry 2023-06-30 15:13:58 +08:00
@heguangyu5 改源码怕不稳定,话说 23 年是 AOT 元年啊,springboot/dotnet 都出 AOT 了,再也不用缓慢的运行时,PHP 官方跟进下就好了。
|
17
mrpzx001 2023-06-30 15:14:16 +08:00
比 static-php 多了代码保护的作用?
|
18
heguangyu5 OP @learningman
没有尝试编译过,但应该没问题. 插件可以编译成一个个的.so, 然后调用 dl()函数加载进来. 因为 BPC 的目标是源码保护,而不是性能,所以 php 的动态特性该有的都实现了. |
19
happy321 2023-06-30 15:25:36 +08:00 via iPhone
kphp 的 mysql redis 都要重新开发,你这个是直接使用原生的吗?
大佬 能不能自己实现服务器,类似 swow workerman libuv 那样,既能加密又能引入一些高并发的东西 |
20
heguangyu5 OP @mrpzx001 BPC 的核心目标是两个,一是源码保护,二是软件授权.
另外 BPC 重新实现了 php 的 runtime 和每一个扩展函数,部署出去时,服务器上是没有 php 运行环境的,就相当于是 C 写的程序,只不过是 php 转译的.但是从外部看,所有表现都很像 php. |
21
heguangyu5 OP @happy321 BPC 也是重新实现了每一个扩展,只不过扩展开发简单一些,并且还有 php 扩展源码做参考.
BPC 不以性能为第一目标,能和 php 持平就可以了,但和 php 的兼容性一定要高,这样能在 php 环境下做开发调试,只是发布时拿 BPC 编译一下. |
22
heguangyu5 OP @jry 所以这时间有测试用例保障是非常重要的.一个黑盒子,给定同样的输入,给出同样的输出,内部怎么改都没什么可怕的.要是没有完善的测试用例,做起来心里肯定不踏实.
|
23
happy321 2023-06-30 21:28:07 +08:00 via iPhone
@heguangyu5 原生的 PHP 性能已经跟不上了,遇到几个慢查询 就玩完了…… 建议自己实现一个服务器吧 swow 是用 c 语言的 libuv 构建的 可以参考一下 或者 直接引用进来
|
24
millken 2023-06-30 22:29:32 +08:00
是否支持跨平台编译
|
25
heguangyu5 OP @millken BPC 不支持跨平台编译,这只是实现时的简化选择而已.
BPC 将 php 编译成 bigloo scheme,而 bigloo scheme 是支持多平台并且能够 Cross Compilation 的.如果愿意,肯定是能做到的,但目前还没到那个阶段. 1. http://www-sop.inria.fr/indes/fp/Bigloo/index.html 2. http://www-sop.inria.fr/indes/fp/Bigloo/manual-chapter33.html |