Ошибка сегментации PHP, вызванная php while loop

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

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

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

php5 5.2.10.dfsg.1-2ubuntu6.1

Ответ 1

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

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

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

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

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

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

Ответ 2

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