从php执行MSSQL存储过程

从php执行MSSQL存储过程,php,Php,我试图从php调用MS SQL存储过程 我已经在ManagementStudio中使用硬编码参数单独测试了存储过程,并且能够以预期的结果执行它 然而,当我试图从php调用它时,我得到了这些错误 警告:mssql_execute()[function.mssql execute]:第145行的C:\xampp\htdocs\index.php中的存储过程执行失败 致命错误:第146行的C:\xampp\htdocs\index.php中超过了60秒的最大执行时间 在我发布的代码中,第145行是ms

我试图从php调用MS SQL存储过程

我已经在ManagementStudio中使用硬编码参数单独测试了存储过程,并且能够以预期的结果执行它

然而,当我试图从php调用它时,我得到了这些错误

警告:mssql_execute()[function.mssql execute]:第145行的C:\xampp\htdocs\index.php中的存储过程执行失败

致命错误:第146行的C:\xampp\htdocs\index.php中超过了60秒的最大执行时间

在我发布的代码中,第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); 

错误是说您的存储过程运行时间超过60秒。默认情况下,PHP超时时间为60秒(在PHP.ini和mysql.connect\u timeout中以秒为单位设置)

您应该尝试在SQL Query Analyzer中手动运行该过程,并使用与超时相同的值,然后查看需要多长时间。例如,如果服务器上的文件为c:\temp\csvfile.csv,批次ID为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()命令之前将它们打印出来,然后将它们插入查询分析器

当您知道需要多长时间后,您可以将过程的超时时间调整为60秒以上。另一种方法是优化存储过程(如果可能),或者尽可能运行较小的CSV批处理。请注意,在增加60秒查询超时后,可能会遇到其他超时。例如,PHP本身将在PHP.ini的max_execution_time中设置一个超时。Apache的默认超时时间也为300(5分钟)。因此,当您增加一个超时时,您可能会遇到另一个超时,并且也必须增加该超时


另一种解决此问题的方法是在命令行模式下运行PHP,从shell脚本或批处理文件或其他文件运行。这可以让您绕过大多数超时(至少是Apache和PHP)。

您实际上希望在PHP.ini文件中查找
mssql.timeout
值。或者如果它不在那里设置它。您正在点击的消息。

在执行行之后回显mssql\u get\u last\u message(),以了解有关错误的更多信息。发回详细信息。我添加了timout错误消息,但没有收到任何新的错误信息。谢谢大家的回复。我花了几天的时间来处理它,最后我使用的是这个。我使用php变量设置execute$userquery=“execute storedproc$var1,$var2…”然后使用mssql_query($userquery,$db)并使其工作,而无需初始化和绑定所有参数。谢谢大家的回答帮助我找到了有效的解决方案。