通过fast-cgi使用php时,我已经回顾了一些关于HTTP 500原因的线程,但是没有一个(我能找到的)与odbc_result调用相关,并且基于大小是间歇性的(可能)或从结果集中提取的数据的内容(似乎不太可能)。
我的php代码如下所示:
$sql = "select [errorSummary],[messageLog],[scanType],[runName]
FROM [SDITriage].[dbo].[SourceJobs]
Where id = $sourceJobID";
Debug("Import job scan message query = $sql");
# perform the query
$result = odbc_exec($odbcConn, $sql);
if (! $result)
{
# get the odbc error message
$returnData["error"] = "Unable to query the import job scan message data from the triage database: " . odbc_errormsg($odbcConn);
$returnData["rc"] = FALSE;
Debug("GetScanMessageData exit. (2) " . print_r($return,TRUE));
$nestingLevel--;
return($returnData);
}
# fetch import job data
$fetchResult = odbc_fetch_row($result);
Debug("Fetch Result = $fetchResult");
$returnData["errorSummary"] = ($fetchResult ? odbc_result($result,1) : "");
$returnData["messageLog"] = ($fetchResult ? odbc_result($result,2) : "");
$returnData["type"] = ($fetchResult ? odbc_result($result,3) : "");
$returnData["name"] = ($fetchResult ? odbc_result($result,4) : "");
在上面查询的大多数调用中,我得到http 500错误,并在odbc_result($ result,2)行上触发。我的php_errors.log文件中没有信息。我做了一个odbc跟踪,它显示:
php-cgi 2624-1c30输入SQLExtendedFetch HSTMT
0x01FA9968 UWORD 1 SQLLEN 1 SQLULEN * 0x0118E9EC UWORD * 0x0118E9F8php-cgi 2624-1c30 EXIT SQLExtendedFetch,返回码为1 (SQL_SUCCESS_WITH_INFO)HSTMT 0x01FA9968 UWORD
1 SQLLEN 1 SQLULEN *
0x0118E9EC(1)UWORD * 0x0118E9F8(5)DIAG [01004] [Microsoft][ODBC SQL Server Driver]String data, right
截断(0)
DIAG [01004] [Microsoft][ODBC SQL Server Driver]String data, right
截断(0)
DIAG [01004] [Microsoft][ODBC SQL Server Driver]String data, right
截断(0)
DIAG [01004] [Microsoft][ODBC SQL Server Driver]String data, right
截断(0)
但这并没有告诉我任何可以跟进的明确错误。我假设这可能是一个内存问题,因为从结果集中提取的数据非常大,所以我将php memory_limit指令增加到512M,但这没有任何影响。有时,查询可以工作,数据在我的应用程序中正确提取和显示,但仅适用于相对较小的值。如果有任何不同,内容是html代码的一个片段。
事件日志确认它是fastcgi / php-cgi问题,但我无法从中收集到其他信息:
Faulting application name: php-cgi.exe, version: 5.4.13.0, time stamp: 0x514274c8
Faulting module name: MSVCR90.dll, version: 9.0.30729.6161, time stamp: 0x4dace5b9
Exception code: 0xc0000005
Fault offset: 0x0002466e
Faulting process id: 0x1f70
Faulting application start time: 0x01cef76dab28188c
Faulting application path: c:\php\php-cgi.exe
Faulting module path: C:\Windows\WinSxS\x86_microsoft.vc90.crt_1fc8b3b9a1e18e3b_9.0.30729.6161_none_50934f2ebcb7eb57\MSVCR90.dll
Report Id: f82eac41-6360-11e3-9a7c-00505684708c
此时,我不确定是否是导致崩溃或php本身的ODBC。任何帮助将不胜感激。
谢谢, 克里斯
答案 0 :(得分:0)
事实证明问题出在php odbc.defaultlrl设置中。如果我的数据小于该值的大小,一切都很好。如果它稍微大一些,它就不会崩溃,但是输出包含看起来很像读取缓冲区的垃圾。如果数据更大,php-cgi.exe会崩溃。
我所采用的修正案是直截了当的。我做了一个预查询,其中我使用datalengh()函数来获取大型消息日志的大小,然后我使用ini_set动态增加odbc.defaultlrl值的大小,然后我执行查询以获取数据。它现在工作正常。