У меня есть простой бесконечный рекурсивный код здесь:
<?php
function test(){
test();
}
test();
Когда я пытаюсь запустить то же самое, он съедает всю память, и в итоге мой ноутбук зависает.
То, что я ищу, это способ поймать это и остановить машину от зависания.
Есть ли обработчик ошибок в php для того же?
Вещи, которые я прочитал и попробовал: установка max_execution_time, скажем, 5
сек и поймать строку ошибки нет. Эта работа dint как предложено
Любой другой способ поймать и остановить это?
<?php
function test($tryCount=1){
$tryCount++;
//terminate recursive if more than 10 times loop
if($tryCount > 10){
return false;
}
test($tryCount);
}
test();
Если вам нужно ограничить память (а не время процессора), потребляемую процессом php, см. этот вопрос.
Если вы хотите ограничить количество уровней рекурсивных вызовов, которые вы разрешаете … это другой вопрос, и я не знаю, как это сделать. Но я удивлен, что это будет проблемой, потому что согласно этот вопрос, PHP уже имеет 100-уровневый предел рекурсии, которого должно быть достаточно, чтобы остановить ваш скрипт до того, как он израсходует значительную память.
Ограничьте использование памяти подпроцесса оболочки:
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
Возможно, вы захотите скопировать файл по умолчанию вместо того, чтобы просто указать один из вариантов.