Гипотетический вопрос для вас всех, чтобы пожевать...
Недавно я ответил на другой вопрос о SO, где PHP script был segfault, и это напомнило мне то, что я всегда задавал себе вопрос, поэтому давайте посмотрим, сможет ли кто-нибудь пролить свет на него.
Рассмотрим следующее:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
Очевидно, что эта (бесполезная) функция бесконечно петли. И, в конце концов, закончится память, потому что каждый вызов функции выполняется до того, как предыдущий закончен. Похоже на разветвленную бомбу без разветвления.
Но... в конечном итоге на платформах POSIX script умрет вместе с SIGSEGV (он также умирает в Windows, но более изящно - насколько это может сказать мои крайне ограниченные навыки отладки низкого уровня). Количество циклов варьируется в зависимости от конфигурации системы (память, выделенная для PHP, 32 бит /64 бит и т.д.) И ОС, но мой реальный вопрос: почему это происходит с segfault?
- Это просто, как PHP обрабатывает ошибки "вне памяти"? Разумеется, должен быть более грациозный способ справиться с этим?
- Это ошибка в движке Zend?
- Есть ли способ, которым это можно контролировать или обрабатывать более изящно из PHP script?
- Есть ли какой-либо параметр, который обычно контролирует максимальное количество рекурсивных вызовов, которые могут выполняться в функции?