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

PHP 编译器 BPC 7.3 发布,成功编译 ThinkPHP8

  •  1
     
  •   heguangyu5 · 110 天前 · 1824 次点击
    这是一个创建于 110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    BPC 是一个 PHP Native Compiler,可以将 PHP 源码最终转译成 C 语言,然后编译成动态链接库或可执行程序.

    BPC 还内置软件授权机制,最终可实现源码保护、软件授权、二进制打包三合一!

    彻底解决 PHP 项目的交付问题.

    How BPC Works

    1. 官网 bpc.dev
    2. 安装使用文档

    写在前面:

    1. bpc 不是一个开源项目,项目历史可以翻看之前的文章和帖子.
    2. ThinkPHP8 的编译只是一个可行性验证,请勿用于生产环境.

    1. 了解 ThinkPHP

    之前就有网友提过能不能编译 ThinkPHP,我也翻看过几次 ThinkPHP 的代码,虽然 ThinkPHP 带有测试用例,但是一眼看去很少,不清楚能覆盖到多少功能点.

    再加上我自己从没写过 ThinkPHP 的项目,对 ThinkPHP 很陌生,所以一直没有尝试编译.

    由于 php 的动态性和 bpc 与 php 的高兼容特点,bpc 编译通过不代表就没问题了,如果有测试用例保障的话,通过运行测试用例可以验证编译后的二进制可执行文件是否与原来的 php 等同.

    2. 迁移 OurBlog 到 ThinkPHP

    之前写的一本关于 PHPUnit 的电子书《 PHPUnit in Action --- The Easy Way 》里有一个博客项目 OurBlog,虽然功能很简单,但基本的 CURD 都涉及到了,测试也非常完整.

    于是就想着把 OurBlog 迁移到 ThinkPHP 试一下,由于有测试保障,这个迁移应该比较好做.

    一番折腾之后,迁移成功了! 源码见: bpc-thinkphp8-ourblog

    3. BPC 编译: 理清依赖

    在使用 composer 创建 ThinkPHP 项目时,可以看到一个 ThinkPHP8 项目有以下依赖:

    league/mime-type-detection (1.15.0)
    league/flysystem (2.5.0)
    
    psr/container (2.0.2)
    psr/http-message (1.1)
    psr/simple-cache (3.0.0)
    psr/log (3.0.0)
    
    symfony/polyfill-mbstring (v1.29.0)
    symfony/var-dumper (v7.1.1)
    
    topthink/think-helper (v3.1.6)
    topthink/think-orm (v3.0.20)
    topthink/framework (v8.0.3)
    topthink/think-filesystem (v2.0.2)
    topthink/think-trace (v1.6)
    

    进一步地,跑通 OurBlog 测试用例, 只需要搞定 3 个依赖就可以了:

    1. psr/simple-cache (3.0.0)
    2. topthink/think-helper (v3.1.6)
    3. topthink/think-orm (v3.0.20)

    最后,ourblog 的前端界面能正常运行,不需要搞定所有依赖,只需要搞定下边 4 个就行了:

    1. psr/container (2.0.2)
    2. psr/http-message (1.1)
    3. psr/log (3.0.0)
    4. topthink/framework (v8.0.3)

    由于 topthink/framework 和 think-orm 里都包含了 think\Facadethink\Exception , 需要把 think-orm/stubs 独立出来, 再加上 ourblog 项目本身,一共 9 个 repo, 见这里.

    4. BPC 编译: 调整代码

    要想一行代码不动就能编译成功,几乎是不可能的.

    代码调整主要集中在 3 个方面:

    1. 语法: bpc 不支持的语法可以通过 phptobpc 做转换, 转换也不支持的,就需要手动调整代码了.
    2. 判断 php 代码文件是否存在: bpc 编译后都是二进制了,不能使用 is_file/is_dir/file_exists/glob 来判断,要换用 bpc 自己的专有函数.
    3. Reflection: bpc 不支持 Reflection,使用 Reflection 实现的功能要调整成 bpc 的方式.

    代码调整的细节可以查看每个 repo 的 commit 历史.

    5. 运行

    1. 创建数据库
    2. 运行 tp8-ourblog-althttpd-ubuntu-24.04-amd64

    详见: bpc-thinkphp8-ourblog release v0.1

    后边可以出个视频来演示一下整个编译运行的过程.

    10 条回复    2024-09-12 14:30:50 +08:00
    lhasa
        1
    lhasa  
       110 天前
    一几年做全栈的时候公司整天用 ThinkPHP 3 ,这玩意不如 Laravel 好用,功能有点模仿的意思
    x86
        2
    x86  
       110 天前
    @lhasa #1 都用 tp3 了就不要和其它的比了,能跑起来就行🐶
    yiqiao
        3
    yiqiao  
       110 天前
    @lhasa tp3 还没有 laravel 的影子,5 开始才是。和 yii2 倒是类似。
    ModiKa2022
        4
    ModiKa2022  
       110 天前
    Bob PHP Compiler, 这个真没用过,
    我在想使用场景, PHP -> 二进制. 代码保护是一个主要的用途, 可是 PHP 代码加密已经比较成熟了
    并且上了二进制之后, 项目的远程调试就不支持了.
    heguangyu5
        5
    heguangyu5  
    OP
       110 天前
    @ModiKa2022 BPC 主要解决源码保护和软件授权这两个问题.

    "PHP 代码加密已经比较成熟" 这个认知不清楚从哪儿来的.
    我了解到的几乎所有的加密方案都有现成的或者可能的还原方法.
    ixixi
        6
    ixixi  
       110 天前
    这年头项目都卖不出去了 🤣
    sunchuo
        7
    sunchuo  
       80 天前
    https://github.com/rectorphp/rector
    有没有可能。使用这个自动 把不兼容的部分 port 到 bpc ?
    而且希望能尽快跟上最新版 PHP 。



    另外请教一下:ionCube 的加密强度如何?
    heguangyu5
        8
    heguangyu5  
    OP
       80 天前
    @sunchuo 目前 bpc 对 PHP 的支持足够我们自己用,所以没有跟进最新版 PHP 的计划.

    另外 PHP 新版本的一些改进我并不觉得很好,所以不打算在 bpc 中支持.

    ioncube 的话,从 easytoyou 上可以看到 ioncube11.x 是可以在线 decode 的,我自己并没有项目使用过,不确定其加密强度.
    sunchuo
        9
    sunchuo  
       79 天前
    @heguangyu5 嗯。那没必要这么费劲推广开源了哈。
    heguangyu5
        10
    heguangyu5  
    OP
       79 天前
    @sunchuo 这个也不好说,3 年前还不支持 namespace,closure,generators,traits 呢,现在都支持了.需求来了的时候,就跟上了.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2539 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 05:03 · PVG 13:03 · LAX 21:03 · JFK 00:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.