Почему бесконечно рекурсивная функция в PHP приведет к SegFault?

Гипотетический вопрос для всех вас, чтобы жевать ...

Я недавно ответил на другой вопрос, так где, когда скрипт PHP был SegFaulting, и он напомнил мне о чем-то, что я Всегда задавался вопросом, так что давайте посмотрим, сможет ли кто-нибудь пролить свет на него.

Рассмотрим следующее:

<?php

  function segfault ($i = 1) {
    echo "$i\n";
    segfault($i + 1);
  }

  segfault();

?>

Очевидно, это (бесполезные) функциональные петли бесконечно бесконечно. И в конце концов, покончит из памяти, потому что каждый вызов функции выполняется до того, как предыдущий закончил. Вроде как вилочная бомба без погружения.

Но ... в конце концов, на POSIX платформах, скрипт умрет с SIGSEGV (он также умирает в Windows, но более изящно - насколько моя чрезвычайно ограниченная навыки отладки низкого уровня). Количество петлей варьируется в зависимости от конфигурации системы (память, выделенная PHP, 32-битным / 64битом и т. Д.) И ОС, но мой реальный вопрос - почему это происходит с SegFault?

  • Это просто как ручки PHP ошибки вне памяти? Конечно, там должен быть более изящный способ обращения с этим?
  • Это ошибка в двигателе Zend?
  • Есть ли способ, которым это можно контролировать или обрабатывать более изящно из-за скрипта PHP?
  • Любая настройка, которая обычно контролирует, что максимальное количество рекурсивных вызовов, которые могут быть сделаны в функции?
31
задан DaveRandom 6 September 2011 в 23:50
поделиться