PHP does not respect the maximum execution time set [duplicate] - php

This question already has answers here:
Does sleep time count for execution time limit?
(5 answers)
Closed last year.
I am running scripts that last longer than the limit allowed by the server and the server does not terminate them.
The phpinfo() showed me that the max_execution_time is set to 30.
Using the ini_get('max_execution_time') feature the value 30 is displayed, but I put the code with sleep(45) and it runs until the end.
I also tried decreasing the time with ini_set('max_execution_time', 15), but still the code runs normally with sleep(45).
I've used sleep for testing purposes, but this is with functions that use cURL or even foreach and while that are used to create files for users.
What could be changing the server's maximum execution time?

"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."
Copied from: sleep().
In other words: Sleep() was a bad choice for testing maximum execution time.

Related

set_time_limit does not work to create a timeout [duplicate]

I have two questions concerning the sleep() function in PHP:
Does the sleep time affect the maximum execution time limit of my PHP scripts? Sometimes, PHP shows the message "maximum execution time of 30 seconds exceeded". Will this message appear if I use sleep(31)?
Are there any risks when using the sleep()function? Does it cost a lot of CPU performance?
You should try it, just have a script that sleeps for more than your maximum execution time.
<?php
sleep(ini_get('max_execution_time') + 10);
?>
Spoiler: Under Linux, sleeping time is ignored, but under Windows, it counts as execution time.
It only affects script time not system calls like sleep(). There is apparently a bug where on Windows sleep() is included. Max execution time is about real-time, not CPU time or anything like that. You can change it however:
max_execution_time directive in your php.ini. This is a global setting;
Using ini_set() with the above directive. This will change it only for the currently executing script only for that execution;
set_time_limit(): also a local change.
As for the difference between the last two, I believe max_execution_time is a fixed quantity. Running:
ini_set('max_execution_time', 60);
will limit to the script to 60 seconds. If after 20 seconds you call:
set_time_limit(60);
the script will now be limited to 20 + 60 = 80 seconds.
From the PHP sleep() page, there's this user-contributed note:
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.
Others have already covered the basics of sleep() and PHP script execution time limit, but you should also be aware of another risk when using really long sleep periods.
Usually, when a browser sends a request to a server and does not receive any data from the server, the connection can time out. This time limit depends on the browser's configurations, but I've read that IE7 has a default value of just 30 seconds, while Firefox has a default value of 115 seconds--you can check your own configuration in Firefox by going to about:config and filtering for network.http.keep-alive.timeout (the time limit is specified in seconds).
Edit: I had the units for network.http.keep-alive.timeout and browser.urlbar.search.timeout mixed up. It is indeed in seconds, not tenths of a second.
a) Yes, it counts toward the time limit (so sleep(31) will trigger an error)
b) It does the opposite of costing CPU performance - it lets other applications use the CPU (when an application sleeps, the CPU usage of that application will be near 0%). Aside from taking time away from the user, I can't really think of any risks of using this.

PHP max_execution_time shows but not works [duplicate]

I have two questions concerning the sleep() function in PHP:
Does the sleep time affect the maximum execution time limit of my PHP scripts? Sometimes, PHP shows the message "maximum execution time of 30 seconds exceeded". Will this message appear if I use sleep(31)?
Are there any risks when using the sleep()function? Does it cost a lot of CPU performance?
You should try it, just have a script that sleeps for more than your maximum execution time.
<?php
sleep(ini_get('max_execution_time') + 10);
?>
Spoiler: Under Linux, sleeping time is ignored, but under Windows, it counts as execution time.
It only affects script time not system calls like sleep(). There is apparently a bug where on Windows sleep() is included. Max execution time is about real-time, not CPU time or anything like that. You can change it however:
max_execution_time directive in your php.ini. This is a global setting;
Using ini_set() with the above directive. This will change it only for the currently executing script only for that execution;
set_time_limit(): also a local change.
As for the difference between the last two, I believe max_execution_time is a fixed quantity. Running:
ini_set('max_execution_time', 60);
will limit to the script to 60 seconds. If after 20 seconds you call:
set_time_limit(60);
the script will now be limited to 20 + 60 = 80 seconds.
From the PHP sleep() page, there's this user-contributed note:
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.
Others have already covered the basics of sleep() and PHP script execution time limit, but you should also be aware of another risk when using really long sleep periods.
Usually, when a browser sends a request to a server and does not receive any data from the server, the connection can time out. This time limit depends on the browser's configurations, but I've read that IE7 has a default value of just 30 seconds, while Firefox has a default value of 115 seconds--you can check your own configuration in Firefox by going to about:config and filtering for network.http.keep-alive.timeout (the time limit is specified in seconds).
Edit: I had the units for network.http.keep-alive.timeout and browser.urlbar.search.timeout mixed up. It is indeed in seconds, not tenths of a second.
a) Yes, it counts toward the time limit (so sleep(31) will trigger an error)
b) It does the opposite of costing CPU performance - it lets other applications use the CPU (when an application sleeps, the CPU usage of that application will be near 0%). Aside from taking time away from the user, I can't really think of any risks of using this.

How to increase execution time of shell commands? [duplicate]

This question already exists:
Python execution from php
Closed 6 years ago.
I am using exec() to run python script from cakephp, upto 30 seconds it is working fine after that php is aborting but still in background python is running to complete the process.
I am using ajax post method and running python and waiting for response. In this workflow if execution of python is crossing 30 seconds the php is not waiting for the response. I am using nginx server. I tried to modify php.ini file to increase max_execution_time=600. But still the issue remains same.
Use set_time_limit() for example:
<?php
set_time_limit(40);//set script's execution time limit to 40 seconds
in large backstage task, I usually apply set_time_limit(0); which means no time limit is imposed.

PHP executes longer than max_execution_time... sometimes

I have a PHP class, once called, sets the time limit to 60 seconds. The only special thing about this class is that it uses curl_multi_exec().
set_time_limit(60);
ini_set('max_execution_time', 60);
The problem is that under Apache's /server-status page, this page and another one that uses single threaded curl run past their max_execution_time and reach up to 200 seconds, sometimes!
What am I missing? Is there a way to setup Apache to terminate scripts (or even connections) running for longer than say 90 seconds?
From the manual:
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(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running.
Because curl requests fall under this category, time spent waiting for a request to complete will not be counted. You should set the curl setting CURLOPT_TIMEOUT to a lower value, or monitor the time spent in executing your script yourself.
Aha! When you set that configuration, the ticker resets itself, example:
sleep(10);
set_time_limit(20);
sleep(10);
set_time_limit(5);
sleep(10); // dies after 5 seconds
Total running time is ~30s.
With regards to curl_exec_multi, you can set the CURL timeout option instead of the PHP one. This depends on who would rather die in your opinion - the curl connection, or the full request.

How does PHP max_execution_time work?

I have few doubts about maximum execution time set in php.ini.
Assuming max_execution_time is 3 minutes, consider the following cases:
I have a process which will end in 2 minutes.
But it's in a loop and it should work 5 times. So it become 10 minutes.
Will the script run properly without showing error for timeout? Why?
PHP function just prints the data and it will take only 2 minutes.
But the query execution is taking 5 minutes.
Will the script run without error? Why?
My single php process itself take 5 minutes.
But am calling the script from command line.
Will it work properly? Why?
How are memory allowed and execution time related?
If execution time for a script is very high
But it returns small amount of data
Will it affect memory or not? Why?
I want to learn what is happening internally, that is why am asking these.
I don't want to just increase time limit and memory limit.
The rules on max_execution_time are relatively simple.
Execution time starts to count when the file is interpreted. Time needed before to prepare the request, prepare uploaded files, the web server doing its thing etc. does not count towards the execution time.
The execution time is the total time the script runs, including database queries, regardless whether it's running in loops or not. So in the first and second case, the script will terminate with a timeout error because that's the defined behaviour of max_execution_time.
External system calls using exec() and such do not count towards the execution time except on Windows. (Source) That means that you could run a external program that takes longer than max_execution_time.
When called from the command line, max_execution_time defaults to 0. (Source) So in the third case, your script should run without errors.
Execution time and memory usage have nothing to do with each other. A script can run for hours without reaching the memory limit. If it does, then often due to a loop where variables are not unset, and previously reserved memory not freed properly.

Categories