PHP 编译器 BPC 6.2 发布,直接编译 PHP 文件为 web server! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heguangyu5
V2EX    PHP

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

  •  
  •   heguangyu5 2023-06-29 18:04:02 +08:00 3190 次点击
    这是一个创建于 859 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    how BPC works

    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, 感兴趣的可以试一试!

    althttpd-demo

    25 条回复    2023-07-01 08:43:26 +08:00
    vitovan
        1
    vitovan  
       2023-06-29 18:26:52 +08:00
    下一步就是 WebAssembly 了吧。
    happy321
        2
    happy321  
       2023-06-29 22:16:54 +08:00 via iPhone
    workerman 全是原生的 建议把这个的兼容性弄好一点? 把一项做精。
    可以去 workerman.net 发帖 大家都需要这个工具
    CodeCodeStudy
        3
    CodeCodeStudy  
       2023-06-30 09:11:49 +08:00
    老哥能坚持下来不容易啊
    heguangyu5
        4
    heguangyu5  
    OP
       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
        5
    rm0gang0rf  
       2023-06-30 10:38:05 +08:00
    主流框架能编不
    heguangyu5
        6
    heguangyu5  
    OP
       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
        7
    chenjia404  
       2023-06-30 11:24:07 +08:00
    这个有没有使用案例呢?
    heguangyu5
        8
    heguangyu5  
    OP
       2023-06-30 11:37:18 +08:00
    @chenjia404 目前整个 BPC 就我们自己的项目在用,之前都是 apache+mod_bpc 发布的,很快线上都会升级成 nginx + althttpd 形式的,毕竟只有一个文件,部署起来方便很多.

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

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

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

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

    另外 BPC 重新实现了 php 的 runtime 和每一个扩展函数,部署出去时,服务器上是没有 php 运行环境的,就相当于是 C 写的程序,只不过是 php 转译的.但是从外部看,所有表现都很像 php.
    heguangyu5
        21
    heguangyu5  
    OP
       2023-06-30 15:31:33 +08:00
    @happy321 BPC 也是重新实现了每一个扩展,只不过扩展开发简单一些,并且还有 php 扩展源码做参考.

    BPC 不以性能为第一目标,能和 php 持平就可以了,但和 php 的兼容性一定要高,这样能在 php 环境下做开发调试,只是发布时拿 BPC 编译一下.
    heguangyu5
        22
    heguangyu5  
    OP
       2023-06-30 15:36:23 +08:00
    @jry 所以这时间有测试用例保障是非常重要的.一个黑盒子,给定同样的输入,给出同样的输出,内部怎么改都没什么可怕的.要是没有完善的测试用例,做起来心里肯定不踏实.
    happy321
        23
    happy321  
       2023-06-30 21:28:07 +08:00 via iPhone
    @heguangyu5 原生的 PHP 性能已经跟不上了,遇到几个慢查询 就玩完了…… 建议自己实现一个服务器吧 swow 是用 c 语言的 libuv 构建的 可以参考一下 或者 直接引用进来
    millken
        24
    millken  
       2023-06-30 22:29:32 +08:00
    是否支持跨平台编译
    heguangyu5
        25
    heguangyu5  
    OP
       2023-07-01 08:43:26 +08:00
    @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
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1503 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 16:39 PVG 00:39 LAX 08:39 JFK 11:39
    Do have faith in what you're doing.
    ubao msn 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