Как сохранить 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";

Несмотря на то, что время ожидания сценария не должно превышаться, время ожидания вызова sql все еще зависит от времени ожидания.

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

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

Спасибо

13.12.2008 17:52:28
Получаете ли вы сообщение об ошибке? Если это так, то проблема связана с MySQL, а не с PHP.
Peter Howe 13.12.2008 17:57:18
5 ОТВЕТОВ
РЕШЕНИЕ

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

set_time_limit(0);
ignore_user_abort(1);
34
13.12.2008 18:34:02
Ответил в 2008 году. Еще помог мне в 2013 году. Большое спасибо, сэр.
user1589754 25.09.2013 13:26:22
Так рада найти этот ответ! ^ Это почти 2014, и это все еще помогает!
amurrell 31.12.2013 01:53:47
У меня тоже работает, август 2016!
Darwin Santos Arismendy 10.08.2016 18:29:06

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

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

2
13.12.2008 17:57:22

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

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

0
13.12.2008 18:10:02

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

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

0
13.12.2008 18:10:05
Хотя это помогло бы PHP не истечь, время не имеет ничего общего с MySql.
rckehoe 14.03.2014 13:39:31

Согласно инструкции :

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

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

4
13.12.2008 18:39:37
В дополнение к тому, что вы говорите: это исправило эти другие проблемы, потому что так получилось, что время ожидания сценария истекло до завершения запроса. Вот почему это решение сработало, но на самом деле это не правильное решение.
rckehoe 14.03.2014 13:38:56
Вы пропустили эту важную часть «Заметки»: это не так в Windows, где измеренное время реально.
Vincent 15.11.2019 17:00:33