рекурсия — Как остановить бесконечную рекурсивную функцию в php, которая потребляет всю доступную память и в конечном итоге приводит к поломке ноутбука?

У меня есть простой бесконечный рекурсивный код здесь:

        <?php

function test(){
test();
}
test();

Когда я пытаюсь запустить то же самое, он съедает всю память, и в итоге мой ноутбук зависает.
То, что я ищу, это способ поймать это и остановить машину от зависания.
Есть ли обработчик ошибок в php для того же?

Вещи, которые я прочитал и попробовал: установка max_execution_time, скажем, 5
сек и поймать строку ошибки нет. Эта работа dint как предложено

Любой другой способ поймать и остановить это?

0

Решение

<?php

function test($tryCount=1){
$tryCount++;
//terminate recursive if more than 10 times loop
if($tryCount > 10){
return false;
}
test($tryCount);
}
test();
1

Другие решения

Если вам нужно ограничить память (а не время процессора), потребляемую процессом php, см. этот вопрос.

Если вы хотите ограничить количество уровней рекурсивных вызовов, которые вы разрешаете … это другой вопрос, и я не знаю, как это сделать. Но я удивлен, что это будет проблемой, потому что согласно этот вопрос, PHP уже имеет 100-уровневый предел рекурсии, которого должно быть достаточно, чтобы остановить ваш скрипт до того, как он израсходует значительную память.

0

Ограничьте использование памяти подпроцесса оболочки:

Ince Так как вы заявляете, что используете Ubuntu, вы можете ограничить память ваших процессов.

$ ulimit -v 500000
$ php -r 'function test() { test(); } test();'
mmap() failed: [12] Cannot allocate memory
mmap() failed: [12] Cannot allocate memory
PHP Fatal error:  Out of memory (allocated 304087040) (tried to allocate 262144 bytes) in Command line code on line 1

Из php вы можете установить опцию конфигурации memory_limit:

$ php -r 'ini_set("memory_limit", "500MB"); function test() { test(); } test();'
PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted (tried to allocate 262144 bytes) in Command line code on line 1

Теперь вы также можете отредактировать memory_limit в php.ini по умолчанию, или вы можете сделать определенный для своего скрипта.

$ echo 'memory_limit = 500MB' > test.ini
$ php --php-ini test.ini -r 'function test() { test(); } test();'
Fatal error: Allowed memory size of 2097152 bytes exhausted (tried to allocate 262144 bytes) in Command line code on line 1

Возможно, вы захотите скопировать файл по умолчанию вместо того, чтобы просто указать один из вариантов.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector