PHP 编译器 BPC 新里程碑达成: 可以编译 web 应用了! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heguangyu5
V2EX    PHP

PHP 编译器 BPC 新里程碑达成: 可以编译 web 应用了!

  •  1
     
  •   heguangyu5 2022-06-07 11:58:24 +08:00 3530 次点击
    这是一个创建于 1226 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不清楚 BPC 是什么的参看这里:

    开发了一年多的 PHP 编译器 BPC 初见成效,发一些测试程序给大家看看

    PHP 编译器 BPC 第一个成功案例来了!

    新里程碑

    在过去的 3 个多月里,我们完成了 apache2 module mod_bpc 的开发,使得 bpc 可以将 php web 项目编译成动态链接库文件(.so)加载到 apache2 里,像 mod_php 那样运行.

    扩展方面,我们实现了 session,spl,pdo,pdo_mysql,pdo_sqlite,filter.

    php 方面,我们改写了 phpunit,使之能够编译运行.

    mod_bpc 提供 web 访问,session 管理用户状态,pdo 连接数据库,phpunit 测试保障.到此,php web 开发的最小核心都 ready 了.

    php web 项目展示

    两年前,我写了一本电子书 《 PHPUnit in Action --- The Easy Way 》.

    这本书通过一个完整的实战项目介绍了云招 OurATS 11 年来实践 PHPUnit/DbUnit 的经验.

    这个实战项目是一个极简的 blog 项目,但麻雀虽小,五脏俱全,包含了用户注册 /激活 /登录 /退出 /文章的 CURD/打标签 /上传文件等功能及相应的测试方法.

    这里我使用 bpc 将其编译成动态链接库,给大家展示下 bpc 编译的 web 项目是什么样子的.

    该项目的 php 源码在这里: https://github.com/heguangyu5/PHPUnit-in-Action-Code/tree/bpc/ourblog

    由于 php 代码最终被编译成了动态链接库,所以运行此项目不需要 php 环境.

    以下假设我们在一台全新的 Ubuntu 18.04 amd64 server 上部署此项目.

    第一步: 安装 apache2 和 mysql server

    sudo apt install apache2 mysql-server 

    由于 apache 默认启用了 module mpm_event,而我们需要 mpm_prefork,所以切换下.

    sudo a2dismod mpm_event sudo a2enmod mpm_prefork 

    第二步: 创建 our_blog 数据库

    wget https://www.ourats.com/bpc/ourblog/our_blog.sql sudo mysql < our_blog.sql 

    第三步: 安装 bpc runtime 及扩展

    bpc 的 pdo_mysql 扩展基于 libmysqlclient 实现,所以需要先安装 libmysqlclient.

    sudo apt install libmysqlclient20 wget https://www.ourats.com/bpc/ourblog/bpc-common-2.0.tar.gz sudo tar -C / -zxf bpc-common-2.0.tar.gz 

    第四步: 安装并启用 mod_bpc

    wget https://www.ourats.com/bpc/ourblog/libapache2-mod-bpc.tar.gz sudo tar -C / -zxf libapache2-mod-bpc.tar.gz sudo ldconfig sudo a2enmod bpc 

    第五步: 部署 ourblog 项目

    wget https://www.ourats.com/bpc/ourblog/libourblog_u-4.4a.so sudo mv libourblog_u-4.4a.so /usr/local/lib/ 

    配置 /usr/local/etc/bpc.conflibourblog_u-4.4a.so 以 web lib 加载.

    sudo vi /usr/local/etc/bpc.conf # 最后一行 (web-libs bpctest) 改为 (web-libs ourblog) 

    配置 apache 虚拟主机

    wget https://www.ourats.com/bpc/ourblog/bpc.ourblog.me.conf sudo mv bpc.ourblog.me.conf /etc/apache2/sites-available/ sudo mkdir /var/www/bpc.ourblog.me sudo touch /var/www/bpc.ourblog.me/index.php sudo mkdir /var/www/bpc.ourblog.me/upload sudo chown www-data:www-data /var/www/bpc.ourblog.me/upload sudo a2enmod rewrite sudo a2ensite bpc.ourblog.me.conf sudo systemctl restart apache2 

    修改本机 /etc/hostsbpc.ourblog.me 指向 Ubuntu 18.04 amd64 server 的 IP 地址.

    浏览器访问 http://bpc.ourblog.me 即可.

    要想进一步使用各个功能,需要点击 Sign Up 注册一个帐号,然后去数据库 mail_queue 表中找到激活链接激活帐号.然后就可以点击 Sign In 登录到后台进行文章的 CURD 操作.文件上传在 admin/upload.php页面.

    到此,一个 bpc 编译的极简的 php web 项目就运行起来了.

    关于 phpunit

    phpunit 可以很好地保障编译后的 php 代码和 php 本身运行效果一致.

    《 PHPUnit in Action --- The Easy Way 》 的读者可以下载 sync-test-db.sh run-testrun-all-tests-bpc.sh 试一下.

    运行这几个程序需要 《 PHPUnit in Action --- The Easy Way 》中构建的 mysql-3307,所以如果你没有环境就不用试了.

    运行效果如下:

    wget https://www.ourats.com/bpc/ourblog/sync-test-db.sh wget https://www.ourats.com/bpc/ourblog/run-test wget https://www.ourats.com/bpc/ourblog/run-all-tests-bpc.sh chmod a+x sync-test-db.sh run-test run-all-tests-bpc.sh mkdir -p ./OurBlog/Upload wget -O OurBlog/Upload/ourats.png https://www.ourats.com/css/img/logo-white.png ./sync-test-db.sh ./run-all-tests-bpc.sh === Run Reg,Activate === PHPUnit 4.8.36 by Sebastian Bergmann and contributors. ..................... Time: 98 ms, Memory: 26.84MB OK (21 tests, 41 assertions) === Run BaseDbTablesInit === PHPUnit 4.8.36 by Sebastian Bergmann and contributors. . Time: 33 ms, Memory: 17.54MB OK (1 test, 1 assertion) === Run Others === PHPUnit 4.8.36 by Sebastian Bergmann and contributors. ......................................... Time: 208 ms, Memory: 43.46MB OK (41 tests, 75 assertions) 
    27 条回复    2022-06-08 16:15:20 +08:00
    rekulas
        1
    rekulas  
       2022-06-07 12:38:33 +08:00
    写编译器,厉害了,支持下
    我最近也在研究 php 源码加密,打算做一个类似 swoole compiler 的扩展,目前刚开始有兴趣的可以关注下
    https://github.com/del-xiong/screw-opcode
    第一步先抛弃源码直接 aes 加密 opcode 运行 第二步研究如何能底层混淆 测试版即将发布
    CodeCodeStudy
        2
    CodeCodeStudy  
       2022-06-07 13:10:20 +08:00
    BPC 的作用是为了保护源码?
    sadfQED2
        3
    sadfQED2  
       2022-06-07 13:51:01 +08:00 via Android
    这样搞的用途是啥?
    heguangyu5
        4
    heguangyu5  
    OP
       2022-06-07 14:09:13 +08:00
    @rekulas 我想你肯定知道 opcode 是可以反编译的,基于 opcode 就要做好和相关从业人员斗智斗勇的准备.我们没那个精力,所以没走那条路.
    heguangyu5
        5
    heguangyu5  
    OP
       2022-06-07 14:14:04 +08:00
    @CodeCodeStudy 出发点是为了保护源码,但做下来之后,发现还能解决一些其它问题,比如软件授权,扩展开发等.
    microxiaoxiao
        6
    microxiaoxiao  
       2022-06-07 16:06:13 +08:00 via Android
    php 代码还保护啥呀,拿着开源做闭源是不是可能会做无用功。
    Y29tL2gwd2Fy
        7
    Y29tL2gwd2Fy  
       2022-06-07 16:12:59 +08:00 via Android
    @microxiaoxiao ???迷惑发言
    brader
        8
    brader  
       2022-06-07 16:14:53 +08:00
    请教个问题,为什么还用 apache 啊,大家生产不是一直用 nginx 吗,apache 并发扛得住不
    heguangyu5
        9
    heguangyu5  
    OP
       2022-06-07 16:20:49 +08:00
    @brader nginx 的后边是 php-fpm 或者 apache,你不是搞 php 的吧
    microxiaoxiao
        10
    microxiaoxiao  
       2022-06-07 16:21:59 +08:00 via Android
    @Y29tL2gwd2Fy 哈哈,仅仅猜测。我不懂 php ,下次不说了
    heguangyu5
        11
    heguangyu5  
    OP
       2022-06-07 16:29:36 +08:00
    @microxiaoxiao 实际上代码保护是个通用的问题,不止 php,java 和 C#这类基于中间码的语言都有代码保护的需求,java 有 graalvm,C#好像也有 Native AOT.
    jaggle
        12
    jaggle  
       2022-06-07 16:32:22 +08:00
    @microxiaoxiao 开源跟非编译语言是两回事
    brader
        13
    brader  
       2022-06-07 16:50:15 +08:00
    @heguangyu5 是搞 PHP 的啊,但是我从来没遇到你说的这样干啊。。。我们配置都是 nginx+php , 或者看到别人的就是 apache+php , 很少看到套娃 nginx+apache+php 这样部署
    keepeye
        14
    keepeye  
       2022-06-07 16:58:01 +08:00
    swoole compiler 是不是也是类似的
    heguangyu5
        15
    heguangyu5  
    OP
       2022-06-07 17:06:25 +08:00
    @brader 你说的 nginx+php 应该是 nginx+php-fpm,别人的 apache+php 是 apache+mod_php,确实应该没人搞套娃的 nginx+apache+php-fpm,不过应该有人用 nginx+apache+mod_php

    我现在做的是 apache+mod_bpc,如果我后边也搞一个 fastcgi-bpc 的话,那就可以 nginx+fastcgi-bpc 了
    brader
        16
    brader  
       2022-06-07 17:09:48 +08:00
    @heguangyu5 嗯,对的,apache+mod_php 见过,nginx+apache+mod_php 目前遇到的所有项目没有这样套两层部署的。
    heguangyu5
        17
    heguangyu5  
    OP
       2022-06-07 17:10:44 +08:00
    @keepeye
    swoole compiler 和 ionCube 以及一楼在做的产品是一类的.
    bpc 和 kphp(将 php 编译为 C++) peachpie(将 php 编译为 C#)是一类的.
    brader
        18
    brader  
       2022-06-07 17:11:23 +08:00
    @heguangyu5 除非是那种,本身部署是 apache+mod_php 模式,但是服务的最前面部署了一个 nginx 作为负载均衡器,这样的我见过
    keepeye
        19
    keepeye  
       2022-06-07 17:15:43 +08:00
    @heguangyu5 懂了,先转译成静态语言再编译成二进制. 我见过一个 zephir 的项目,差不多的,只是写 zephir lang ,编译成 c ,再编译成 php 扩展的
    lesismal
        20
    lesismal  
       2022-06-07 17:35:43 +08:00   2
    PHP 永远活在 PHPER 心中,永垂不朽!
    danhahaha
        21
    danhahaha  
       2022-06-08 09:13:04 +08:00
    好家伙,不支持 namespace 和 trait
    lp7631010
        22
    lp7631010  
       2022-06-08 09:45:23 +08:00
    除了更适合卖系统,不暴漏源码,想不出有什么别的优势。不过光这点也有其存在的价值。
    heguangyu5
        23
    heguangyu5  
    OP
       2022-06-08 11:17:52 +08:00
    @danhahaha 等有钱有人了,就加上
    heguangyu5
        24
    heguangyu5  
    OP
       2022-06-08 11:41:32 +08:00
    @lp7631010 这个项目的出发点就是为了解决源码保护和软件授权问题,也就是让 php 写的软件能放心地售卖.

    至于别的优势,目前体验到的就是写扩展更容易了,我是不会写 php 扩展的,但把 php 已有的扩展移植到 BPC 或者把需要的 C 库写成 BPC 扩展都很容易做.

    还有一个算不上是优势,可以当作特点吧.对于 cli 项目来说,可以 static link 成一个只有很少依赖的可执行文件,比如 bob-parser 和 bob-finder,软件分发和使用更容易了.
    ellermiter
        25
    ellermister  
       2022-06-08 14:47:23 +08:00
    @heguangyu5 你的另外一个 screw-plus 支持 swoole cli 运行模式么
    ellermister
        26
    ellermister  
       2022-06-08 14:48:17 +08:00
    哎呀,艾特错人了。
    @rekulas 你的另外一个 screw-plus 支持 swoole cli 运行模式么
    rekulas
        27
    rekulas  
       2022-06-08 16:15:20 +08:00
    @ellermister 没了解过 swoole cli 不太清楚
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3500 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 04:40 PVG 12:40 LAX 21:40 JFK 00:40
    Do have faith in what you're doing.
    ubao 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