【PHP】PHP require引起的 SIGBUS

2017-07-11 0 条评论 1.06k 次阅读 3 人点赞

PHP中有这么一个问题, 到2017年仍然没有解决。大概是这么一个问题运行下面这句 shell 就可能出现下面的coredump。

代码很简单:

test.php内容:

运行之后,产生coredump如下:

问题的原因 nikic 给出了很清晰的解释:

说白了就是require_oncetest.tpl这个文件的大小在不停的变化, 从而导致这个问题。具体想深入了解下怎么回事的参考下 tlpi Chapter 49。

怎么知道系统底层用 mmap引起的?可以用strace 跟踪上面 php 的运行,观察到 require/require_once/include/include_once 底层的系统调用。另外nikic上面也有提示。

sigbus 最小完整问题复现

下面是一段c 代码模拟出现sigbus的情况,其实也是上面这个问题触发sigbus时, 最小完整问题复现代码。

我的系统页面大小为 4k (具体数值 linux 下可用 getconf PAGESIEZE 获得)

总结

如何避免这个 sigbus 引起的 coredump

  • 不使用 require/inlude 函数加载大小变化文件。
  • 如果非要加载的话,避免文件大小变化的同时加载文件。
  • 如果文件大小变化的同时加载文件,保证页面大小不属于文件大小变化的范围 (min,max) % 页面大小

上面三个建议都可以。

原文


PS:如果你觉得本站内容对你有帮助,不如把本站收藏到你的收藏夹,以便下次查看~也欢迎在下方分享点赞以及发言讨论~

Kiwi

Valar Morghulis