Я был удивлен, когда просто попробовал следующий код PHP:
function foo() { foo(); } foo();
Я ожидал получить «500: Внутренняя ошибка сервера». Вместо этого соединение было немедленно закрыто (без байтов), а файлы журналов показывают, что apache segfaulted. WTF? Является ли это известной ошибкой в PHP? Есть ли какие-то параметры конфигурации, которые мне не хватает? Потому что разбитый процесс для каждого случайного переполнения стека, ну … довольно неприемлемый, я думаю.
PHP не может справиться с этим, он просто перейдет в бесконечный цикл и вызовет ошибку сегментации.
http://bugs.php.net/bug.php?id=49823
также
http://www.mail-archive.com/php-bugs@lists.php.net/msg128905.html
избегайте использования рекурсивных функций, как правило, это плохая идея «0 riiight :))), они были изобретены, потому что у нее плохая идеа:)) …
Я рекомендую установить верхний предел hrd по количеству вызовов функций. НЕ используйте глобальные переменные (вам может потребоваться вызвать более рекурсивные функции, зачем загрязнять глобальные переменные?). Вы можете использовать дополнительные параметры для функции
function a($param1, $param2, $depth=100){ $depth--; if(!$depth==0) return error }
Взято из iBlog – Илья Альшанецкий
Переполнение стека. PHP не имеет внутренней защиты стека, которая предпочитает полагаться на системный стек без какой-либо защиты. Это означает, что если у вас есть рекурсивная функция или метод PHP, то в конечном итоге произойдет сбой.
function a() { a(); } a();
Есть 2 решения этой проблемы: 1 избегайте использования рекурсивных функций, как правило, это плохая идея, и если вы ДОЛЖНЫ использовать их, реализуйте некоторый счетчик, используя глобальную переменную, которая предотвратила бы функцию от итерации себя больше, чем X количество времени для значений от X от 500 до 1000. Другое решение включает использование расширения xdebug, которое реализует защиту от переполнения стека, определяя предел того, насколько глубокие могут рекурсивные функции проходить через значение php.ini. Это лучшее решение в средах размещения, где у вас нет контроля над сценариями, запущенными на сервере.
Я думаю, что это известная ошибка. См. Список Топ-10 способов свернуть PHP .