Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : PHP Options&Information : set_time_limit

set_time_limit

Limits the maximum execution time (PHP 4, PHP 5)
void set_time_limit ( int seconds )


Code Examples / Notes » set_time_limit

php

You may also need to look at Apache's timeout setting (Win32 version for me), I changed max execution time value in php.ini, and still got stopped by Apache's timeout value in the httpd.conf file.

mba_aslam

while setting the set_time_limit(), the duration of sleep() will be ignored in the execution time. The following illustrates:
<?php
set_time_limit(20);
while ($i<=10)
{
       echo "i=$i ";
       sleep(100);
       $i++;
}
?>
Output:
i=0 i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8 i=9 i=10


rsallo

When you are working with IIS, PHP timeout is valid only when it's lower than script timeout defined by IIS.
IIS 5 has a default timeout of 300 seconds. If you need a higher timeout, you also have to change IIS properties. Otherwise, your server will stop your PHP script before it reaches its own timeout.


sjoerd van der hoorn

When using the set_time_limit() function, the browser will stop after about 30 seconds if it does not get new data. To prevent this, you can send every 10 seconds a little snippet of data (like a single character) to the browser. The code below is tested with both Internet Explorer and Firefox, so it will stay online all the time.
You should also create a file called chatdata.txt which contains the last thing said on a chatbox. Please note that you can also replace this function with a MySQL or other database function...
<?php
set_time_limit(900);
// Start output buffering
ob_start();
$message = "First test message";
$oldmessage = "bla";
// Keep on repeating this to prevent PHP from stopping the script
while (true)
{
$timeoutcounter = 0;
while ($message == $oldmessage)
{
// If 10 seconds elapsed, send a dot (or any other character)
if ($timeoutcounter == 10)
{
echo ".";
flush();
ob_flush();
$timeoutcounter = 0;
}
// Timeout executing
sleep(1);
// Check for a new message
$message = file_get_contents("chatdata.txt");
$timeoutcounter++;
}
// Keep the old message in mind
$oldmessage = $message;
// And send the message to the user
echo "<script>window.alert(\"" . $message . "\");</script>";
// Now, clear the output buffer
flush();
ob_flush();
}
?>


16-oct-2001 01:04

user abort stop the script
see "ignore_user_abort"


nathan

unless I am doing something stupid, my testing (at least on php 4.3.4) seems to indicate that sleep() does indeed count towards script execution time, contrary to the previous post.
Here is my test code:
for ($i=0; $i < 10; $i++) {
sleep(10);
echo " [$i] ";
}
This will exceed execution time after only 2 loops.


php

To find out the currently set time limit, use
ini_get('max_execution_time');
If set_time_limit has been previously called in the script, the result will be the value which was passed to set_time_limit (and not, as the function name "ini_get" appears to suggest, the value from the php.ini file).


bjfieldno

Timeouts after five minutes in IIS on Windows are caused by an inherited CGI Timeout value of 300 seconds.  This is not a PHP problem.  The fix is to add custom values for the files or directories that need longer to run.
In IIS 5.0 or 7.0 (beta as of this note), you can change this value on a fairly granular level using IIS Manager, under (roughly) YOURSITE -> Properties -> Home Directory -> Configuration (button) -> Options, but in IIS 6.0, this functionality is turned off (!), so you have to get into the Metabase.
Find the site number in Metabase Explorer (e.g., 12345678), then from CMD prompt:
[get to the scripts dir]
cd C:\Inetpub\AdminScripts
[this for each subdirectory from off the site root]
cscript adsutil.vbs CREATE W3SVC/12345678/root/"MY SUBDIRECTORY" IIsWebDirectory
[this for the file in question]
cscript adsutil.vbs CREATE W3SVC/12345678/root/"MY SUBDIRECTORY"/ILikeToTimeOut.php IIsWebFile
[this to set the timeout]
cscript adsutil.vbs set W3SVC/12345678/root/"MY SUBDIRECTORY"/ILikeToTimeOut.php/CGITimeout "7200"
Note:  "7200" is 2 hours in seconds, but can be whatever.
I derived the solution above from this fine article:
http://www.iis-resources.com/modules/AMS/article.php?
storyid=509&page=3


rycardo74

this work to fine html streaming AND time pass limit
<?
header('Content-type: text/plain');
echo date("H:m:s"), "\n";
set_time_limit(30);
for ($i = 0; $i < 1000; $i++)
{
echo date("H:m:s"),"\n";
for ($r = 0; $r < 100000; $r++){
$X.=  tan(M_LNPI+log(ceil(  date("s")*M_PI*M_LNPI+100)));
}
ob_flush();  
flush();
}
echo "work! $x";
?>
Balin 4 ever
G8 = lies
free your mind


nytshadow

This tripped me up for a bit until I read through the ini settings.  When doing file uploads, max_execution_time does not affect the time even though the error message indicates the script has exceeded the maximum execution time.  The max_input_time determines how much time PHP will wait to receive file data.  The default setting is 60 seconds so while I had my max_execution_time set to 300, the script would fail after 60 seconds but report that it had exceeded the max execution time of 300.

riki1512

The duration of the pause when calling the sleep() function is also not added to script-execution time.

cleverduck

Regarding what 'nytshadow' said, it's important to realize that max-execution-time and the set_time_limit functions measure the time that the CPU is working on the script.  If the script blocks, IE: for input, select, sleep, etc., then the time between blocking and returning is NOT measured.  This is the same when running scripts from the command line interface.  So if you've got a log parser written in PHP that tails a file, that program WILL fail eventually.  It just depends how long it takes to read in enough input to process for 30 seconds.
If you're writing a command line script that should run infinitely, setting max-execution-time to 0 (never stop) is HIGHLY recommended.


jimmy wimenta

Referring the the last 2 comments about whether the duration of sleep() will be counted in execution time, the answer is it depends on the platform. In Linux it does not, while in Windows it does.

riki1512

Please note, that we already discussed, whether the sleeping time, when calling sleep(...) is regarded as execution time or not. An user finally wrote, that under Linux the sleeping time is ignored, but under Windows, it count's as execution time !

jatin

If you set the number of seconds to a very large number (not many ppl do that, but just in case) then php exits with a fatal error like :
Fatal error: Maximum execution time of 1 second exceeded in /path/to/your/script/why.php


konrads dot smelkovs

If you are streaming large data from database, it is counted towards the max exec time.

itbeings

if files are much included...like
<?
include_once "configure.inc";
include_once "header.inc";
include_once "body.inc";
include_once "footer.inc";
?>
and on configure.inc, I have the set_time_limit function to be
<?
set_time_limit(0);
?>
I guess this should work for all the script execution time and not only on configure.inc.


eric pecoraro

I was having trouble with script timeouts in applications where the user prompted long running background actions. I wrote this cURL/CLI background script that solved the problem when making requests from HTTP.
<?php
/* BACKGROUND CLI 1.0
 
  eric pecoraro _at_ shepard dot com - 2005-06-02
  Use at your own risk. No warranties expressed or implied.
  Include this file at the top of any script to run it in the background
  with no time limitations ... e.g., include('background_cli.php');
 
  The script that calls this file should not return output to the browser.
*/
#  REQUIREMENTS - cURL and CLI
  if ( !function_exists('curl_setopt') OR !function_exists('curl_setopt')  ) {
     echo 'Requires cURL and CLI installations.' ; exit ;
  }
 
#  BUILD PATHS
  $script = array_pop(explode('/',$SCRIPT_NAME)) ;
  $script_dir = substr($SCRIPT_NAME,0,strlen($SCRIPT_NAME)-strlen($script)) ;
  $scriptURL = 'http://'. $HTTP_HOST . $script_dir . "$script" ;
  $curlURL = 'http://'. $HTTP_HOST . $script_dir . "$script?runscript=curl" ;
#  Indicate that script is being called by CLI
  if ( php_sapi_name() == 'cli' ) {
     $CLI = true ;
  }
#  Action if script is being called by cURL_prompt()
  if ( $runscript == 'curl' ) {
     $cmd = "/usr/local/bin/php ".$PATH_TRANSLATED ; // server location of script to run
     exec($cmd) ;
     exit;
  }
#  USER INTERFACE
  // User answer after submission.
  if ( $post ) {
     cURL_prompt($curlURL) ;
     echo '<div style="margin:25px;"><title>Background CLI</title>';
     echo 'O.K. If all goes well, <b>'.$script.'</b> is working hard in the background with no ' ;
     echo 'timeout limitations.
<form action='.$scriptURL.' method=GET>' ;
     echo '<input type=submit value=" RESET BACKGROUND CLI "></form></div>' ;
     exit ;
  }
  // Start screen.
  if ( !$CLI AND !$runscript ) {
     echo '<title>Background CLI</title><div style="margin:25px;">' ;
     echo '<form action='.$scriptURL.' method=POST>' ;
     echo 'Click to run <b>'.$script.'</b> from the PHP CLI command line, in the background.
' ;
     echo '<input type=hidden value=1 name=post>' ;
     echo '<input type=submit value=" RUN IN BACKGROUND "></form></div>' ;
     exit ;
  }
#  cURL URL PROMPT FUNCTION
  function cURL_prompt($url_path) {
     ob_start(); // start output buffer
     $c=curl_init($url_path);
     curl_setopt($c, CURLOPT_TIMEOUT, 2); // drop connection after 2 seconds
     curl_exec($c);
     curl_close($c);
     ob_end_clean(); // discard output buffer
  }
?>


27-sep-2006 10:03

After the error
Fatal error: Maximum execution time of [...] seconds exceeded [...]
has appeared, shut-down functions are still called (afterwards). So, by using register_shutdown_function, you can save data in a session and offer the user a link to start the script again. Then the script can go on with the Session-data.
Example: if you are analyzing a text-file, you can save your analyzed data in a session together with the position of the filepointer (ftell) and start from that possition the next time the user runs the script (fseek).
To determine whether the script was finished or aborted, you simply set a bool false at the beginning and true at the end, and in the shutdown-function you check if it's still false.


niam dot niam

<?php
echo date("H:m:s"), "\n";
set_time_limit(30);
for ($i = 0; $i < 100; $i++)
{
sleep(10);
echo date("H:m:s"),"\n";
}
echo "Done!";
?>
Guys! This script runs 100*10 seconds +- few microseconds for circle and output.
But not promissed 30 seconds!!!
set_time_limit sets CPU time! Texted on *NIX.


Change Language


Follow Navioo On Twitter
assert_options
assert
dl
extension_loaded
get_cfg_var
get_current_user
get_defined_constants
get_extension_funcs
get_include_path
get_included_files
get_loaded_extensions
get_magic_quotes_gpc
get_magic_quotes_runtime
get_required_files
getenv
getlastmod
getmygid
getmyinode
getmypid
getmyuid
getopt
getrusage
ini_alter
ini_get_all
ini_get
ini_restore
ini_set
main
memory_get_peak_usage
memory_get_usage
php_ini_scanned_files
php_logo_guid
php_sapi_name
php_uname
phpcredits
phpinfo
phpversion
putenv
restore_include_path
set_include_path
set_magic_quotes_runtime
set_time_limit
sys_get_temp_dir
version_compare
zend_logo_guid
zend_thread_id
zend_version
eXTReMe Tracker