Изменение QueryTimeout из sqlsrv_query

У меня проблемы с медленно выполняющимся запросом, который время от времени выполняется более 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 секунд.)

1 ответ

Решение

Эта ошибка на самом деле является ошибкой 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 максимальное время в секундах, в течение которого вы хотите выполнить запрос.

Другие вопросы по тегам