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

2022-02-25 13:00:42 +08:00
 heguangyu5

不清楚 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 在编译过程中支持随机插入授权判断,大大提高了安全性.

3043 次点击
所在节点    PHP
11 条回复
hefish
2022-02-25 13:27:31 +08:00
这个 感觉好高级。。。
watcher
2022-02-25 14:14:48 +08:00
国内有能落地的商业环境么?
heguangyu5
2022-02-25 14:28:08 +08:00
@watcher 需求本身就是自己的,先满足自己再说.

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

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

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

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

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

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

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

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

不管怎么说,能按自己的喜好做事,真的很棒! 这得感谢云招 OurATS 宽松自由的环境和给力的同事!

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836369

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX