V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heguangyu5
V2EX  ›  PHP

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

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

    不了解 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
        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   ·   实用小工具   ·   4043 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:25 · PVG 13:25 · LAX 21:25 · JFK 00:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.