最近部门将定时脚本切换为 PHP7 命令执行时,发现过一段时间脚本就内存泄漏,且该释放内存的地方都做了处理,经过排查后发现是 XHProf 造成的,关闭后就正常。

XHProf 是 Facebook 开源的一个轻量级的 PHP 性能分析工具,跟 Xdebug 类似,但性能开销更低。可以用在生产环境中,也可以由程序开关来控制是否进行 profile

Facebook 推出这个工具时 PHP 还是他们技术栈重要的一份子。因为 PHP 7 与 PHP 5 存在很大的兼容性问题,Facebook 的 HHVM 团队决定改用 Hack 开发 HHVM。通过减少使用 PHP,HHVM 团队希望 HHVM 和 Hack 能给开发者提供一个更好、更高性能的体验。所以 XHProf 在 PHP7 上有问题也是意料之中的,这个扩展在 https://pecl.php.net/package/xhprof 上处于年久失修的状态。

我们需要找一个处于维护状态且质量高的版本替代,网络上大部分的解决方案是 https://github.com/longxinH/xhprof

安装步骤

cd xhprof/extension/
/usr/local/php/bin/phpize
./configure -prefix=/usr/local/related/xhprof --with-php-config=/usr/local/php/bin/php-config
make && make install

php.ini 中加入配置,这个日志目录自己定

[xhprof]
extension = xhprof.so
xhprof.output_dir = /data/log_xhprof

phpinfo() 查看一下是否成功

Directive Local Value Master Value
xhprof.output_dir /data/log_xhprof /data/log_xhprof
xhprof.sampling_depth 2147483647 2147483647
xhprof.sampling_interval 100000 100000

使用方式见文档:https://www.php.net/xhprof

GUI 分析界面我们使用的:https://github.com/gajus/xhprof.io

编译PHP扩展总结

在 Windows 下我们需要开启某个扩展,很容易。一般情况下,*.dll* 文件都已经躺在 extension 目录下,只等待你在 php.ini 里将它前面的 ; 去掉

而在 Linux,你发现 extensions 目录是空空的,或许只有几个 .so 文件落寞地待着

这里以编译 fileinfo 扩展为例(内置扩展,如果编译的是第三方扩展请自行下载源码)

找到扩展包

你需要到 PHP 源码包里寻找,希望源码包没被你删除。

php-7.x.x/ext/ 目录,你会发现里面有很多内置的扩展,我们进 fileinfo 目录

cd ./php/ext/fileinfo

编译

/usr/local/php/bin/phpize
./configure --with-php-config=/php/bin/php-config
make && make install
  1. 执行 phpize,它是用来安装扩展的工具,这个工具会在当前目录下生成 configure 文件
  2. 编译,with-php-config 参数按照实际情况
  3. 安装

没有意外的话,经过上面的编译,你会生成:php/lib/php/extensions/fileinfo.so
扩展目录根据 php.iniextension_dir 来找

添加配置

最后只需要在配置里把扩展添加进去就好了

extension = fileinfo.so

最后别忘了重启 Web 服务器