У меня есть запрос на обновление, выполняемый задачей 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?
Спасибо






Ваш php работает в безопасном режиме? Цитата из Руководство PHP для 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.
Предполагая, что вы работаете в Linux, системы на основе Debian имеют отдельные конфигурации для mod_php / php cgi и php-cli. Это не должно быть слишком сложно настроить в другой системе Linux, которая не разделяет конфигурацию cgi / cli.
Если у вас есть отдельные конфигурации, я бы скорректировал вашу конфигурацию php cli. Отключите безопасный режим и любые ограничения по времени и тарану.
Ознакомьтесь с некоторыми переменными ограничения ресурсов в php, ini: max_execution_time, max_input_time, memory_limit
Вы также можете установить ограничение по времени для скрипта в самом PHP: http://ca3.php.net/set_time_limit
Хотя это помогло бы PHP не истекать по тайм-ауту, это не имеет ничего общего с MySql.
У меня где-то была такая же проблема, и я "решил" ее с помощью следующего кода (первые две строки моего файла):
set_time_limit(0);
ignore_user_abort(1);
Ответил в 2008 году. Еще помог мне в 2013 году. Большое спасибо, сэр.
Так рада найти этот ответ! ^ Уже почти 2014 год, и это все еще помогает!
У меня тоже работает, август 2016!
Согласно руководство по эксплуатации:
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.
Так что вряд ли это имеет какое-либо отношение к ограничению времени PHP. Какое сообщение вы получаете, когда время истекает? Возможно, здесь задействована настройка MySQL.
Чтобы добавить к тому, что вы говорите: он устранил эти другие проблемы, потому что так получилось, что время ожидания сценария истекло до завершения запроса. Вот почему это решение сработало, но на самом деле это неправильное решение.
Вы упустили эту важную часть «Примечание»: это не так в Windows, где измеренное время является реальным.
Я столкнулся с чем-то похожим в одном из моих PHP-скриптов, я добавил это встроенное прямо перед выполнением медленного запроса:
$timeout_seconds = 3153600; // 1 year...
// Make sure the PHP script doesn't time out
set_time_limit(0);
ignore_user_abort(1);
// Make sure the PHP socket doesn't time out
ini_set('default_socket_timeout', $timeout_seconds);
ini_set('mysqlnd.net_read_timeout', $timeout_seconds);
// Make sure the MySQL server doesn't time out
// Assuming your $link is a MySQLi object:
$link->query("SET SESSION connect_timeout = " . $timeout_seconds);
$link->query("SET SESSION delayed_insert_timeout = " . $timeout_seconds);
$link->query("SET SESSION have_statement_timeout='NO'");
$link->query("SET SESSION net_read_timeout = " . $timeout_seconds);
$link->query("SET SESSION net_write_timeout = " . $timeout_seconds);
Очевидно, вы захотите установить секунды соответствующим образом, но я вообще не хотел, чтобы у моего сценария истекло время ожидания.
Директивы PHP Init: https://www.php.net/manual/en/ini.list.php
Переменные сервера MySQL: https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
Примечание: проверьте документы для получения дополнительной информации, а также убедитесь, что переменные соответствуют версиям PHP и MySQL, которые вы используете. Я использую PHP 7.3 и MySQL 5.7.
** Обновлено: установки таймаутов PHP было недостаточно для моего скрипта, мне также пришлось добавить переменные MySQL SESSION.
Вы получаете сообщение об ошибке? Если это так, то проблема связана с MySQL, а не с PHP.