香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 103|回复: 6

PHP编译器BPC 6.0发布,支持namespace,支持closure,成功 ...

[复制链接]

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-1-8 12:22:50 | 显示全部楼层 |阅读模式
release地址: https://github.com/bob-php-compiler/bpc-release/releases
使用指南: https://github.com/bob-php-compiler/bpc-release/wiki/01_Install
不了解BPC是什么的可以翻看之前的文章.
简言之,BPC可以将PHP代码最终转译成C语言,然后编译成动态链接库或者可执行程序.
BPC 5.0已经能够成功编译Zend Framework 1和我们公司自己的诸多项目.
但要想更广泛的应用,还缺两个大特性:

  • namespace
  • closure
1. 支持 namespace

前些天看到 nikic/PHP-Parser 的 文档, 发现PHP的namespace可以很容易地转化.
于是就照着文档写了一个 phptobpc.php, 借助这个小程序,可以将使用namespace的PHP代码转为没有namespace的.
当然BPC自身也做了相应的支持,这样动态调用也没问题.比如:
<?php
$classname = '\\Foo\\Bar\\Baz';
$o = new $classname;
我把这个程序打包成 phptobpc.phar, 下载回来 chmod +x 就能使用.
2. 支持 closure

BPC之前就已经支持简单的匿名函数,比如:
<?php
$a = array(1,2,3);
usort($a, function ($a, $b) { ... });
BPC 6.0完善了closure实现,支持use,typehint,default value等特性,比如:
<?php
$a = 1;
$b = 2;
$f = function (array $arg1, &$arg2, $arg3 = 1) use ($a, &$b) { ... };
3. 成功编译 workerman

之前有网友说能不能把 workerman 整个编译起来.
现在支持了 namespace 和 closure, 正好可以编译 workerman 试一试.
由于编译后执行和PHP解释执行还是有一些区别,要想成功编译和运行,需要对workerman的代码做一些微调.
整体来说,调整量很小.感兴趣的可以去查看 git commit .
由于 workerman 没有 unit tests, 我们自己也没有 workerman 的项目,所以不好做完整的验证.
但我照着 workerman手册, 写了以下几个例子:

  • start.php
  • ws_test.php
  • tcp_test.php
  • SimpleChat.php
  • BinaryTransfer.php
  • TextTransfer.php
运行起来,测试了一下,没有问题.
start start -d stop restart status connections 这些命令都OK.
但是由于编译后只有一个二进制文件,reload显然是达不到预期效果的.
这几个例子我都静态编译出来了,想动手试一下的直接 下载 回来 gunzip 然后 chmod +x 执行即可 (注意只能在ubuntu 18.04上运行).
想自己动手编译的,参看 src/Makefile 和 examples/build.sh
4. 几个常见问题?


  • BPC是否开源?
    BPC是我们公司的内部项目,不打算开源.
    商业化策略还未确定,在正式商业化前,我们每次release都会带一个约7天的试用license,如果过期了还想试用,只要给我们发个邮件我们就会再给license.
    如果想要就此项目进行深度合作,可以发邮件到 YnBjQG91cmF0cy5jb20=
  • BPC 和 VKCOM/kphp 以及 peachpiecompiler/peachpie 有什么区别?
    BPC的目标是源码保护和软件授权(最终编译为C),在此基础上尽可能和PHP兼容,也就是说,一个php脚本最好什么都不改就能编译成二进制.
    kphp的目标是性能(编译为C++),为此,它仅支持 limited subset of PHP, 参看 KPHP vs PHP differences
    peachpie的目标也是性能(编译为C#),同时将.NET引进来了.
  • BPC 和 Zend Guard, ionCube 以及 Swoole Compiler 有什么区别?
    Zend Guard, ionCube和Swoole Compiler都是在PHP opcode的基础上进行源码保护的.
    BPC应该来说和它们不是一类东西,只是目标相同罢了,BPC和kphp peachpie算是一类.
  • PHP官方是否会做编译器?
    PHP官方明确不做Native AOT. 参看 Ahead of Time Compiler/AOT for PHP8?
回复

使用道具 举报

3

主题

6

帖子

10

积分

新手上路

Rank: 1

积分
10
发表于 2023-1-8 12:23:06 | 显示全部楼层
能编译laravel吗
回复

使用道具 举报

2

主题

4

帖子

8

积分

新手上路

Rank: 1

积分
8
发表于 2023-1-8 12:23:21 | 显示全部楼层
太好了!支持namespace 和闭包非常重要
回复

使用道具 举报

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-8 12:23:34 | 显示全部楼层
不开源说个锤子
回复

使用道具 举报

1

主题

5

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-1-8 12:24:20 | 显示全部楼层
我觉得这种核心的东西不适合中国人做。 温饱问题都没解决的穷鬼占了这么重要的生态位,肯定不能免费放出来的。 甲骨文每次吃相难看一点都一堆人质疑JAVA还能活多久, PHP这种风雨飘摇的年月里,你们占住茅坑要收费,那会把整个PHP给扳倒的[捂脸][捂脸][捂脸]
回复

使用道具 举报

0

主题

4

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-8 12:25:13 | 显示全部楼层
你可以自己尝试编译一下.
回复

使用道具 举报

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2023-1-8 12:25:23 | 显示全部楼层
非常棒。 我的想法跟你类似,不过目标很轻,把我的后台框架的多个代码编译成几个文件,并且混淆类名和变量名。还有其他一些操作,达到代码不可阅读的目的。再加上版权声明。 分发的是编译后的产物。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 12:43 , Processed in 0.383376 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表