tags:

views:

880

answers:

6

I have an update query being run by a cron task that's timing out. The query takes, on average, five minutes to execute when executed in navicat.

The code looks roughly like this. It's quite simple:

// $db is a mysqli link
set_time_limit (0); // should keep the script from timing out
$query = "SLOW QUERY";
$result = $db->query($query);
if (!$result)
    echo "error";

Even though the script shouldn't timeout, the time spent waiting on the sql call still seems to be subject to a timeout.

Is there an asynchronous call that can be used? Or adjust the timeout?

Is the timeout different because it's being called from the command line rather than through Apache?

Thanks

+1  A: 

Is your php running in safe-mode? Quote from PHP manual of set_time_limit:

This function has no effect when PHP is running in safe mode. There is no workaround other than turning off safe mode or changing the time limit in the php.ini.

Tuminoid
A: 

Assuming you are on linux, Debian based systems have separate configurations for mod_php/php cgi and php-cli. This shouldn't be too difficult to set up on a different linux system that doesn't separate cgi/cli configuration.

Once you have separate configs, I would adjust your php cli configuration. Disable safe mode and any time limits and ram limits.

epochwolf
A: 

Check out some of the resource limit variables in php,ini: max_execution_time, max_input_time, memory_limit

You could also set a time limit for the script in PHP itself: http://ca3.php.net/set_time_limit

barfoon
+3  A: 

I had the same problem somwhere, and "solved" it with the following code (first two lines of my file):

set_time_limit(0);
ignore_user_abort(1);
Karsten
A: 

According to the manual:

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(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running.

So it's unlikely to have anything to do with PHP's time limit. What message are you getting when it times out? Perhaps there's a MySQL setting involved.

JW
A: 

Fix your query. The default lifetime for a script is 30 seconds. Any query running longer than that is broken.

ieure