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

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

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

    不清楚 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,软件分发和使用更容易了.
    ellermister
        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   ·   我们的愿景   ·   实用小工具   ·   1014 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:46 · PVG 03:46 · LAX 12:46 · JFK 15:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.