PHP 编译器 BPC 的第一个成功案例来了! - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
heguangyu5
V2EX    PHP

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

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

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

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

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

    先上链接

    < href="https://www.ourats.com/bpc/bob-parser.trial" rel="nofollow">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 呢.
    U7Q5tLAex2FI0o0g
        10
    U7Q5tLAex2FI0o0g  
       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     Solana     2393 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 14:33 PVG 22:33 LAX 06:33 JFK 09:33
    Do have faith in what you're doing.
    ubao msn 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