Intereting Posts
Извлечь текст из строки до ":", если существует? PHP MYSQL: способ отображения таблицы в порядке возрастания Загрузка файла с использованием PHP CURL Как загрузить файл с его оригинальным именем вместо уникального имени? Что означает число после «break» или «continue» в PHP? Как получить реферер, платные / натуральные и ключевые слова для текущего посетителя на PHP с помощью новой Google Analytics? PHP (или что-то еще) CGI-конфигурация в web.config IIS Как реализовать API Gmail OAuth для отправки электронной почты (особенно через SMTP)? Создание уникального идентификатора в PHP Преобразование MD5 в base62 для URL Как написать getter / setter для доступа к многоуровневому массиву по ключевым словам? Автоматизированная электронная почта с PHP и MySQL? Как использовать транзакцию в php / mysql shell_exec () возвращает значение null на "ls" Лучший способ разработки / управления / разработки повторяющихся задач / календаря

PHP не обрабатывает переполнение стека?

Я был удивлен, когда просто попробовал следующий код PHP:

function foo() { foo(); } foo(); 

Я ожидал получить «500: Внутренняя ошибка сервера». Вместо этого соединение было немедленно закрыто (без байтов), а файлы журналов показывают, что apache segfaulted. WTF? Является ли это известной ошибкой в ​​PHP? Есть ли какие-то параметры конфигурации, которые мне не хватает? Потому что разбитый процесс для каждого случайного переполнения стека, ну … довольно неприемлемый, я думаю.

Related of "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 .