(给PHP开发者加星标,提升PHP技能)
转自:韩天峰
http://rango.swoole.com/archives/325
最近在帮同事解决Swoole Server问题时,发现有1个worker进程一直处于R的状态,而且CPU耗时非常高。初步断定是PHP代码中发生死循环。
下面通过一段代码展示如何解决PHP死循环问题。
#dead_loop.php$array = array();for($i = 0; $i < 10000; $i++){
$array[] = $i;}include __DIR__."/include.php";#include.phpwhile(1){
usleep(10); $keys = array_flip($array); $index = array_search(rand(1500, 9999), $array); $str = str_repeat('A', $index); $strb = test($index, $str);}function test($index, $str){
return str_replace('A', 'B', $str);}
通过ps aux得到进程ID和状态如下,使用gdb -p 进程ptrace跟踪,通过bt命令得到调用栈
htf 3834 2.6 0.2 166676 22060 pts/12 R+ 10:50 0:12 php dead_loop.phpgdb -p 3834(gdb) bt#0 0x00000000008cc03f in zend_mm_check_ptr (heap=0x1eaa2c0, ptr=0x2584910, silent=1, __zend_filename=0xee3d40 "/home/htf/workspace/php-5.4.27/Zend/zend_variables.c",__zend_lineno=182, __zend_orig_filename=0xee1888 "/home/htf/workspace/php-5.4.27/Zend/zend_execute_API.c", __zend_orig_lineno=437)at /home/htf/workspace/php-5.4.27/Zend/zend_alloc.c:1485#1 0x00000000008cd643 in _zend_mm_free_int (heap=0x1eaa2c0, p=0x2584910, __zend_filename=0xee3d40 "/home/htf/workspace/php-5.4.27/Zend/zend_variables.c", __zend_lineno=182,__zend_orig_filename=0xee1888 "/home/htf/workspace/php-5.4.27/Zend/zend_execute_A