我试图调用MS SQL存储过程形式php。
我已经在管理工作室中使用硬编码参数测试了存储过程本身,并能够使其以预期的结果执行。
然而,当尝试从php调用它时,我得到这些错误。
警告:mssql_execute() [function。msssql -execute]: C:'xampp'htdocs'index.php第145行存储过程执行失败
致命错误: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_timeout以秒为单位设置)
您应该尝试在SQL Query Analyzer中使用与超时时间相同的值手动运行该过程,并查看需要多长时间。例如,如果服务器上的文件是c:'temp'csvfile.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()命令之前将它们打印出来,然后将它们插入查询分析器中。
当您知道需要多长时间时,您可以将过程的超时调整为超过60秒。另一种方法是优化存储过程(如果可能),或者运行较小的CSV批处理。请注意,在增加60秒查询超时后,可能会遇到其他超时。例如,PHP本身将在PHP.ini中的max_execution_time中设置超时。Apache的默认超时也为300(5分钟)。因此,当您增加一个超时时,您可能会遇到另一个超时,并且也必须增加它。
另一个解决这个问题的方法是在命令行模式下运行PHP,从shell脚本或批处理文件或其他东西。这样可以避免大多数超时(至少在Apache和PHP中)。
您实际上希望在php.ini文件中查找mssql.timeout
值。或者如果它不在那里设置它。默认值是60(秒),也就是你点击的时间。