Выполнение хранимой процедуры MSSQL из php

#php

#php #php-mssql

Вопрос:

Я пытаюсь вызвать хранимую процедуру MS SQL из php.

Я протестировал хранимую процедуру самостоятельно в Management Studio с жестко закодированными параметрами и смог заставить ее выполняться с ожидаемыми результатами.

Однако при попытке вызвать ее из php я получаю эти ошибки.

Предупреждение: mssql_execute() [function.mssql-execute]: сбой выполнения хранимой процедуры в C:xampphtdocsindex.php в строке 145

Неустранимая ошибка: превышено максимальное время выполнения в 60 секунд в C:xampphtdocsindex.php в строке 146

в коде, который я публикую, строка 145 — это команда mssql_execute.

будем признательны за любую помощь.

     $userQuery = "select top 1 id from bravo_biometric_batch order by id desc";
    $result = mssql_query($userQuery,$DB);
    $bravo_biometric_batch_id = mssql_result($result,0,0);

    $company_year_id = 237;
    $date = date("Ymd");
    $server_file_name = "e:\bravo_csv\".$filename;

    $csv_proc_name = mssql_init('bulk_insert_bravo_csv',$DB);
    mssql_bind($csv_proc_name, '@data_csv_file',$server_file_name,SQLVARCHAR, false,false,200);
    mssql_bind($csv_proc_name, '@bravo_biometric_batch_id',$bravo_biometric_batch_id, SQLINT2, false,false, 10);
    mssql_bind($csv_proc_name, '@company_year_id',$company_year_id, SQLINT2, false,false,10);
    mssql_bind($csv_proc_name, '@upload_date',$date, SQLVARCHAR, false,false,20);

    mssql_execute($csv_proc_name); 
  

Комментарии:

1. повторите mssql_get_last_message() после строки выполнения, чтобы узнать больше о вашей ошибке. Отправьте ответ с подробностями. php.net/manual/en/function.mssql-get-last-message.php

2. Я добавил сообщение об ошибке таймаута и не получил никакой новой информации об ошибке.

Ответ №1:

Ошибка говорит о том, что выполнение вашей хранимой процедуры занимает более 60 секунд. По умолчанию время ожидания PHP истекает через 60 секунд (это значение задается в секундах в php.ini с mysql.connect_timeout)

Вы должны попробовать запустить процедуру вручную в анализаторе запросов SQL с теми же значениями, которые вы используете, и посмотреть, сколько времени это займет. Например, если файл был c:tempcsvfile.csv на сервере, идентификатор пакета 1234, год компании 2011 и текущее время для даты, вы бы использовали:

 print 'Start time: '   getdate()
exec 'bulk_insert_bravo_csv' 'c:\temp\csvfile.csv', 1234, 2011, getdate()
print 'End time: '   getdate()
  

Обратите внимание, что любые символы должны быть экранированы как при запуске SQL в анализаторе запросов.

При этом будет запущена та же команда и выведено время до и после. Затем вы можете увидеть, сколько времени это занимает. Если вы не уверены в используемых значениях, распечатайте их на своей странице PHP перед командой mysql_execute(), затем подключите их в query analyzer.

Когда вы знаете, сколько времени это займет, вы можете настроить время ожидания для вашей процедуры, чтобы оно составляло более 60 секунд. Другим методом было бы оптимизировать вашу хранимую процедуру (если возможно) или запускать меньшие пакеты CSV, если вы можете. Имейте в виду, что вы можете использовать другие тайм-ауты после увеличения 60-секундного тайм-аута запроса. Например, сам PHP будет иметь тайм-аут, установленный в max_execution_time в PHP.ini. У Apache также будет тайм-аут по умолчанию 300 (5 минут). Таким образом, при увеличении одного тайм-аута вы можете столкнуться с другим, и вам также придется увеличить его.

Еще один способ обойти эту проблему — запустить PHP в режиме командной строки, из сценария оболочки или пакетного файла или чего-то еще. Это позволяет использовать большую часть таймаутов (по крайней мере, Apache, PHP).

Комментарии:

1. Спасибо всем за ваши ответы, я боролся с этим в течение нескольких дней, и в итоге я использовал то, что сработало для меня, это. Я установил выполнение с помощью переменных php. $userquery = «выполнить storedproc $ var1, $ var2 …» затем использовал mssql_query ($ userquery, $ db) и заставил его работать без инициализации и привязки всех параметров спасибо всем за ваши ответы, которые помогли мне найти решение, которое сработало.

Ответ №2:

На самом деле вы хотите искать mssql.timeout значение в файле php.ini. Или, если ее там нет, установите ее. Значение по умолчанию равно 60 (секундам), на что вы и рассчитывали.