Как сохранить PHP скрипт от тайм-аута из-за длинного запроса mysql

У меня есть запрос на обновление, выполняемый задачей cron, которая отключает время. Запрос занимает в среднем пять минут для выполнения при выполнении в navicat.

Код выглядит примерно так. Это довольно просто:

// $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";

Даже несмотря на то, что script не должен выходить из таймаута, время ожидания ожидания вызова sql по-прежнему зависит от тайм-аута.

Есть ли асинхронный вызов, который можно использовать? Или настроить таймаут?

Разве тайм-аут отличается тем, что он вызывается из командной строки, а не через Apache?

Спасибо

Ответ 1

У меня была такая же проблема, как и где-то, и "решил" ее с помощью следующего кода (первые две строки моего файла):

set_time_limit(0);
ignore_user_abort(1);

Ответ 2

В соответствии с руководство:

Примечание: функция set_time_limit() и директива конфигурации max_execution_time влияют только на время выполнения самого script. Любое время, затрачиваемое на активность, которое происходит вне выполнения script, например системных вызовов с использованием system(), операций потока, запросов к базе данных и т.д., Не учитывается при определении максимального времени, в течение которого выполняется script.

Таким образом, это вряд ли имеет какое-либо отношение к временному ограничению PHP. Какое сообщение вы получаете, когда время истекает? Возможно, там используется настройка MySQL.

Ответ 3

Работает ли ваш php в безопасном режиме? Цитата из Руководство PHP по set_time_limit:

Эта функция не действует, когда PHP работает в безопасном режиме. Здесь нет обходной путь, отличный от выключения режима или изменения временного php.ini.

Ответ 4

Предполагая, что вы используете Linux, системы на базе Debian имеют отдельные конфигурации для mod_php/php cgi и php-cli. Это не должно быть слишком сложно настроить на другой Linux-системе, которая не разделяет конфигурацию cgi/cli.

Как только у вас будут отдельные конфиги, я настрою вашу конфигурацию php cli. Отключить безопасный режим и любые ограничения по времени и пределы помех.

Ответ 5

Проверьте некоторые из предельных переменных ресурса в php, ini: max_execution_time, max_input_time, memory_limit

Вы также можете установить ограничение времени для script в самом PHP: http://ca3.php.net/set_time_limit