Set max_execution_time in PHP CLI

LinuxCommand Line-InterfacePhp

Linux Problem Overview


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

Linux Solutions


Solution 1 - Linux

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

Solution 2 - Linux

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

Solution 3 - Linux

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.

Solution 4 - Linux

Use set_time_limit function.

Solution 5 - Linux

You can also use „timeout” linux command:

timeout 5 cliprocess.php

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRadek SimkoView Question on Stackoverflow
Solution 1 - LinuxJonView Answer on Stackoverflow
Solution 2 - LinuxstivloView Answer on Stackoverflow
Solution 3 - LinuxLandonView Answer on Stackoverflow
Solution 4 - LinuxTimofey StolbovView Answer on Stackoverflow
Solution 5 - LinuxKrisView Answer on Stackoverflow