2016-07-20 4 views
1

У меня возникли проблемы с медленным запросом, который занимает более 30 секунд, чтобы выполнять время от времени, поэтому я хотел бы увеличить тайм-аут sqlsrv_query.Изменение QueryTimeout из 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); 

Я понимаю, что мне нужно, чтобы передать детали timout через качестве параметров в sqlsrv_connect, но я не получаю мой синтаксис права.

(я оптимизировал запрос, насколько я могу, к сожалению, учитывая дизайн таблицы БД я не могу заставить его вернуться последовательно менее чем за 30 секунд.)

ответ

4

Эта ошибка на самом деле Ошибка PHP и не имеет ничего общего с драйверами sqlsrv; по умолчанию драйверы sqlsrv будут запускать запрос до получения результата.

Ключ: QueryTimeout
Значение: Положительное целое значение
Описание: Устанавливает время ожидания запроса в секундах. По умолчанию драйвер будет ожидать неопределенный результат.
(курсив мой)

Источник: Options parameter - 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 максимальное время в секундах вы хотите запрос для запуска для.

+0

Благодарим вас за всесторонний ответ! (даже включая бит синтаксиса sqlsrv_query) Я изменил свой php.ini, и моя проблема была решена. – BernardV

+0

«массив (« QueryTimeout »=> 30)» решил для меня аналогичную проблему. Благодарю. – luisdev

+0

Добавление set_time_limit (300); к PHP-коду, который выполнял дорогостоящий запрос базы данных, было обходным решением, которое «исправило» еще одну подобную проблему с тайм-аутом, которую я имел в php-скрипте на медленном, старом и сердитом сервере. – luisdev

Смежные вопросы