Set max_execution_time in PHP CLI
I know that PHP CLI is usually used because of none time limits and primary because it is not using Apache threads/processes.
But is there any way how to explicitly set the max_execution_time for some scripts which i don't want to have the freedom of "unlimited time" and just want to keep those script under control?
If you think this question may be better answered on superuser.com and have permission to move it, do it. :)
Edit: I've been Googling a bit and found the right parameter:
php -d max_execution_time=5 script.php
The documentation says that when running in command line mode, the default is 0 (unlimited). It doesn't say that you cannot override it:
set_time_limit(10); // this way
ini_set('max_execution_time', 10); // or this way
Edit: I just tried it myself, and it works as expected.
F:\dev\www>c:php -f index.php
PHP Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
Fatal error: Maximum execution time of 2 seconds exceeded in F:\dev\www\index.php on line 3
set_time_limit() works in CLI scripts.
<?php
set_time_limit(1); //in seconds
for (;;);
?>
After one second returns with the following error message:
PHP Fatal error: Maximum execution time of 1 second exceeded in \
/home/stivlo/test.php on line 4
Initially I tried with sleep() and the time limit doesn't get applied. As @Jon suggested, using a real computation, like an infinite loop works.
I found this interesting comment in the sleep() PHP page:
Note: The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running
I have a similar problem. But in my case, I had remote database calls taking significant time and I wanted to terminate the script after a certain amount of time. As noted in the other answers, external calls (or sleep()
) doesn't count against the configured timeout setting.
So my approach was to figure out the scripts pid, and then background a kill -9
command after a sleep. Here's a basic example:
$cmd = "(sleep 10 && kill -9 ".getmypid().") > /dev/null &";
exec($cmd); //issue a command to force kill this process in 10 seconds
$i=0;
while(1){
echo $i++."\n";
sleep(1); //simulating a query
}
Note that it's possible that your script ends nicely, and a new, different one starts up with that same pid which this kill command would terminate. That is unlikely, but you should consider that as a possibility if you use this approach.