Bug描述:
在使用file_get_contents($ur);请求一个$url 时,如果server在http请求头还没有完全输出时就意外关闭了连接,则file_get_contents($ur)将因无法读取完整的数据而陷入死循环,这时,进程占用cpu约 100%
影响版本:
本次故障出现在PHP-5.3.3 ,相信此前的版本中应该也存在;以后的版本就不得而知了
Bug重现方法:
server.php
1 2 3 4 5 6 7 |
<?php $str = "HTTP/1.1 200 OK Date: Sat, 07 Jul 2012 07:46:29 GMT"; fgets(STDIN); echo $str; exit; ?> |
client.php
1 2 3 4 |
<?php echo file_get_contents("http://localhost:9090/"); exit; ?> |
在A终端模拟server端:
1 2 |
#mkfifo /tmp/fifo #nc -l localhost -p 9090 </tmp/fifo | php server.php >/tmp/fifo |
在B终端执行client.php
1 |
#php client.php |
在C终端观察client.php 的执行情况
使用gstack查看堆栈状况:
使用gdb分析,参看脚本: php-5.3.3/ext/standard/http_fopen_wrapper.c
可以通过: https://svn.php.net/repository/php/php-src/tags/ 直接查看,在php5.4中还没有修复该bug
提交bug 到 php.net, bug地址: https://bugs.php.net/bug.php?id=63338