原创文章,转载请保留或注明此出处:http://blog.sunnygo.top/2018/05/15/Compile-Phalcon-2.x-From-Zephir.html。
目前公司php服务层大多数项目基本上都用的Phalcon 2.0.13版本。从刚开始用就遇到一些框架固有的缺陷,但因为Phalcon是以php扩展形式安装的框架,感觉修改比较麻烦,就一直没管,而是业务层面绕过框架缺陷来规避问题。
这次遇到一个问题,Phalcon自有的Redis缓存组件,会强制存一份key的副本到_PHCR集合里,而这个集合是没有TTL的,得不到释放(深入的原因本文不再赘述),导致使用一段时间后被这些无用信息塞满了内存。想解决这个问题,在网上调研后,总结了几个可能的解决方案:
综上看来,修改并重新编译Phalcon源代码才是最好的出路。而且有能力修改Phalcon源码后,我们还可以在底层定制适合我们业务的功能,提高程序处理效率。
从Github上clone一份Phalcon源码,检出想要的分支代码。
项目根目录主要结构如下图所示:

Phalcon目前的源码是用一种中间件语言语言zephir来开发的,zephir源码存在根目录/phalcon下,后缀.zep的文件就是。Phalcon完整的编译机制应该是从zep代码编译成c代码,再从c代码编译成php扩展。/ext/phalcon目录则存放被zephir编译后的c文件。
按官网教程,下载项目后直接执行/build下的install脚本来安装。然而经试验我们修改zep源码后install是无法生效的,猜测install的逻辑应该是从/ext/phalcon下的C代码直接编译成扩展。
参考此贴
| g++ >= 4.4 | clang++ >= 3.x | vc++ >= 11 |
注意Zephir Parser是一个php扩展(这里可以猜到,Zephir编译php扩展实际上底层应该还是通过phpize或者php-cli来进行的)
安装
git clone https://github.com/phalcon/php-zephir-parser
cd php-zephir-parser
sudo ./install
将phalcon_parser.so这个扩展加入php.ini
extension=zephir_parser.so
安装Zephir。
git clone https://github.com/phalcon/zephir
cd zephir
./install -c
注意如果像我们使用的是2.0.x版本,官方release不是使用最新版Zephir来编译的,最好还是跟官方保持一致。(编译用的Zephir版本号从CHANGELOG.md里可以查到)。修改如下:
git clone https://github.com/phalcon/zephir
cd zephir
git checkout 0.9.2
./install -c
执行完默认会自动拷贝phalcon.so到php安装目录下的扩展目录下。如果路径不对,也可以从/ext/modules/phalcon.so自行拷贝。
特意整理了下,因为网上关于从zep源码重新编译Phalcon的资料比较少。原创文章,转载请注明出处,谢谢配合。