У меня проблемы с медленно выполняющимся запросом, который время от времени выполняется более 30 секунд, поэтому я хотел бы увеличить время ожидания sqlsrv_query.
Fatal error: Maximum execution time of 30 seconds exceeded
У меня проблемы с моим синтаксисом PHP, как примеры на: http://php.net/manual/en/function.sqlsrv-query.php на самом деле не имеет смысла для меня.
В настоящее время мое подключение / настройка выглядит следующим образом:
$testServer = 'IP\servername,PORT';
$testDetails = array('Database' => 'DBNAME', 'UID' => 'USERNAME', 'PWD' => 'Password');
$testConnect = sqlsrv_connect($testServer, $testDetails);
Насколько я понимаю, мне нужно передать детали тайм-аута в качестве параметров в sqlsrv_connect
но я не понимаю мой синтаксис правильно.
(Я оптимизировал запрос настолько, насколько смог, к сожалению, учитывая структуру таблицы БД, я не смог заставить его последовательно возвращаться менее чем за 30 секунд.)
Эта ошибка на самом деле является ошибкой PHP и не имеет ничего общего с драйверами sqlsrv; по умолчанию драйверы sqlsrv будут выполнять запрос, пока не получит результат.
Ключ: QueryTimeout
Значение: положительное целое значение
Описание: Устанавливает время ожидания запроса в секундах. По умолчанию драйвер будет ждать результатов неопределенное время.
(акцент мой)
Источник: Параметр параметров — sqlsrv_query (php.net)
Ошибка max_execution_time определено в файле php.ini — по умолчанию 30 секунд. Поскольку сценарий выполняется более 30 секунд, синтаксический анализатор завершает сценарий, выдавая фатальную ошибку.
Чтобы устранить эту ошибку, вы можете изменить max_execution_time
установив в файле php.ini или, в качестве альтернативы, вверху вашего скрипта, добавьте:
ini_set("max_execution_time", value); //The value will only be changed for this script!
куда value
это максимальное время в секундах Вы хотите, чтобы скрипт работал.
Поскольку ваш вопрос касается установки времени ожидания для запросов, синтаксис для этого будет:
$result = sqlsrv_query($conn, $query, $params, array("QueryTimeout" => 30));
Где опять же 30
максимальное время в секундах, в течение которого вы хотите выполнить запрос.
Других решений пока нет …