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

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

  •  1
     
  •   heguangyu5 · 2022-02-25 13:00:42 +08:00 · 3001 次点击
    这是一个创建于 763 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    在完成了更多的扩展开发后,BPC 终于成功编译出了它的第一个成规模的应用,来自云招 OurATS 的简历解析工具: bob-parser.

    先上链接

    https://www.ourats.com/bpc/bob-parser.trial 可直接下载,但速度有限

    https://caiyun.139.com/m/i?155CGfDdVPP2m 提取码:zvQ3 和彩云网盘,需要注册才能下载,速度快

    此程序仅在 Ubuntu 18.04 amd64 上测试通过,其它平台不保证.

    下载回来后当然要 chmod a+x bob-parser.trial 才能执行.

    此程序是 bob-parser 的试用版,有诸多限制,正式版是要收费的,先说明一下.

    简单介绍下 bob-parser

    bob-parser 是一个简历解析工具,就是从简历中提取出来姓名,电话,邮箱,工作经历,教育经历等字段的一个程序.

    bob-parser 是一个通用型的解析工具,不是按渠道和模板进行 preg_match 的那种.

    bob-parser 原本是云招 OurATS 招聘管理系统的一个基础组件,后独立出来提供在线 API 调用.

    bob-parser 使用 PHP 语言开发,现经由 BPC,将所有 PHP 文件编译成一个可执行文件发布出来了.

    官网地址是: https://www.bob-parser.com

    借由 bob-parser 深入解说一下 BPC 的几个特性

    1. 100%源码保护

      PHP 的源码保护目前最强的应该就是基于 opcode 的了,但据我所知,现在至少有两个可用的 opcode 反编译器,所以 opcode 没有想像的那么安全.

      对比 java 和 C#就能知道,类似字节码的这种机制,被反编译就是市场需求的问题.

      BPC 完全脱离 Zend,将 PHP 最终编译成 C,要想从可执行文件反汇编出 PHP 是不可能的.

    2. 和 PHP 高度兼容

      说一行代码不用动那是夸张,对于 bob-parser 来说,需要将其从 web 方式运行改由 cli 运行,其实也就是新写一个入口文件,并且这个入口文件本身也还能用 php 执行,这样方便对比解析结果是否完全一致,如果不一致,那说明编译器有问题.

      得益于前期开发 BPC 时 phpt 测试做的扎实,bob-parser 的测试用例全过,也就是说一个简历文件,用 php 执行得到的结果和用 BPC 编译出来的可执行文件运行得到的结果是完全一致的,一个字符不差.

    3. 扩展开发极其容易

      bob-parser 除了 PHP 代码之外,还依赖一些外部程序,这些外部程序是因为之前搞不定 PHP 扩展开发,所以才独立出去的,现在扩展开发容易了,这些外部程序能开发成扩展的都开发成扩展了,这也使得 bob-parser 能够最终只生成一个可执行文件.

    4. 在源码保护和高度兼容的前提下,才会考虑性能和内存占用

    5. 编译器本身内置软件授权机制

      对于能够本地部署的程序来说,做到源码保护只是第一步,尤其是像 bob-parser 这样的工具类程序来说,只有一个可执行文件,方便了部署方便了调用,如果没有可靠的授权机制,出去了一份,就等于全都出去了.

      不管什么样的授权,最终在代码里肯定有一处 if 判断,如果满足条件,继续执行,否则报错退出.

      因此,只要定位到这个 if 判断,让它恒为 true,授权限制就绕过了.

      曾看到过一篇文章,讲的是如何去除试用版 ioncube_encoder_xxx_64 的 14 天限制,对二进制可执行文件做处理的工具都是现成的.

      一个简单的思路就是在 PHP 代码里添加多处授权判断以增加安全性,但这样做一是影响正常逻辑,二是需要手动维护.

      BPC 在编译过程中支持随机插入授权判断,大大提高了安全性.

    11 条回复    2022-02-26 16:49:08 +08:00
    hefish
        1
    hefish  
       2022-02-25 13:27:31 +08:00
    这个 感觉好高级。。。
    watcher
        2
    watcher  
       2022-02-25 14:14:48 +08:00
    国内有能落地的商业环境么?
    heguangyu5
        3
    heguangyu5  
    OP
       2022-02-25 14:28:08 +08:00
    @watcher 需求本身就是自己的,先满足自己再说.

    至于落地,至少在云招已经落地了,线上在跑的简历解析已经不是 php 了,而是 BPC 编译后的可执行文件.
    0o0O0o0O0o
        4
    0o0O0o0O0o  
       2022-02-25 14:44:23 +08:00
    650MB ,虽说现在不怎么看软件体积了,但考虑到描述中这个试用软件的功能不是特别复杂,这方面还是有待优化的。

    太大了下不动就不试着破解了...
    heguangyu5
        5
    heguangyu5  
    OP
       2022-02-25 15:29:01 +08:00   ❤️ 1
    @0o0O0o0O0o 简历解析是个很成熟的软件了,有好几家在做.你可以了解一下他们的部署下来是多大,650M 已经很小了,我见过好几个 G 的呢.
    mrgeneral
        6
    mrgeneral  
       2022-02-25 15:43:07 +08:00
    > BPC 当前不支持 namespace,closure,generators,traits 等现代 PHP 特性,近期也不打算支持.

    这个决策是因为实现成本还是 OP 自身接触到的环境就不需要这些功能?
    heguangyu5
        7
    heguangyu5  
    OP
       2022-02-25 16:17:48 +08:00
    @mrgeneral

    1. namespace 个人不喜欢,用的也不多,真的用到的地方可以调整成不用 namespace 的,个人更偏好 A_B_C 这种全名的.
    2. 匿名函数是支持的,但是不支持 use 语法.这个是因为没花时间去看到底该怎么支持.
    3. generators,traits 我们自己的项目没有用到.

    这个项目当前还处在很早期,看实际需求,也许后边会支持这些特性.
    xumng123
        8
    xumng123  
       2022-02-25 18:30:19 +08:00 via iPhone
    没人用原生的 php 吧,不支持 tp 和 laravel ,将会丢失大量商用用户。

    不支持 namespace 和 trait ,不适合 tp 和 laravel
    heguangyu5
        9
    heguangyu5  
    OP
       2022-02-25 18:51:24 +08:00
    @xumng123 万里长城第一步,你看微软做的 peachpie strlen 返回值还不对呢,俄罗斯做的 kphp 还不支持 calling by name 呢.
    littleylv
        10
    littleylv  
       2022-02-26 10:06:01 +08:00
    如果说因为一些时间、能力等方面的原因不支持 namespace traits 等特性,后续有计划会添加支持。可能大伙还有点兴趣了解一下。

    “BPC 当前不支持 namespace,closure,generators,traits 等现代 PHP 特性,近期也不打算支持.”
    “namespace 个人不喜欢,用的也不多,真的用到的地方可以调整成不用 namespace 的,个人更偏好 A_B_C 这种全名的.”

    看到这里我就直接懒得看你的项目了,管你有多牛多厉害。
    2022 年了……
    heguangyu5
        11
    heguangyu5  
    OP
       2022-02-26 16:49:08 +08:00
    @littleylv 欢迎你在我支持了 namespace traits 后再来关注

    不管怎么说,能按自己的喜好做事,真的很棒! 这得感谢云招 OurATS 宽松自由的环境和给力的同事!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5181 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 09:32 · PVG 17:32 · LAX 02:32 · JFK 05:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.