Ошибка сегментации PHP, вызванная циклом php while - PullRequest
11 голосов
/ 19 ноября 2009

Я нашел способ сделать php segfault, и мне немного любопытно, что происходит. Может, кто-нибудь может объяснить это для меня?

joern@xps:..com/trunk5/tools/nestedset> cat > while.php
<?php
while(1){
        die('dd');
}
?>
^C
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php   
ddzsh: segmentation fault  php -f while.php
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php
dd%                                                                                                                                                                                 
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php
dd%                                                                                                                                                                                 
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php
ddzsh: segmentation fault  php -f while.php
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php
ddzsh: segmentation fault  php -f while.php
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php
dd%                                                                                                                                                                                 
0 joern@xps:..com/trunk5/tools/nestedset> php -f while.php
dd%    

Как видите, это происходит не каждый раз. Php кеширование?

php5 5.2.10.dfsg.1-2ubuntu6.1

Ответы [ 2 ]

4 голосов
/ 23 ноября 2009

Похоже, это связано с известной ошибкой в ​​источнике PHP. Это было исправлено в стволе PHP, и похоже, что оно было выпущено некоторое время вокруг выпуска 5.2.11. Подробнее см. здесь и здесь .

4 голосов
/ 20 ноября 2009

Википедия: Ошибка сегментации

Небольшое исследование показывает, что некоторые расширения PHP могут не очень хорошо играть или не очень хорошо играть друг с другом. Это также может зависеть от сервера или конфигурации сервера.

Если вы используете одновременно загруженные XDebug и Zend Debugger, это может вызвать это.

Сначала я подумал, что, возможно, цикл while, используемый с оператором die (), может быть частью причины. Мне любопытно узнать, вызывает ли это также ошибку сегментации:

while (!$fault) { 
  $fault=check_fault_function();
  }
if ($fault) { die('dd'); }

Если нет, то это может быть просто тем, как вы используете время и умираете вместе. Как вы знаете, while (1) {} - это бесконечный цикл ... (ваш сервер может не знать, как распределить память для бесконечных подпрограмм), поэтому, если вы не пытаетесь вызвать сбои, это обычно плохая практика.

...