在我的php应用程序中执行odbc_result调用时接收HTTP 500内部服务器错误

时间:2013-12-12 20:35:31

标签: php sql odbc

通过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 * 0x0118E9F8

     

php-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。任何帮助将不胜感激。

谢谢, 克里斯

1 个答案:

答案 0 :(得分:0)

事实证明问题出在php odbc.defaultlrl设置中。如果我的数据小于该值的大小,一切都很好。如果它稍微大一些,它就不会崩溃,但是输出包含看起来很像读取缓冲区的垃圾。如果数据更大,php-cgi.exe会崩溃。

我所采用的修正案是直截了当的。我做了一个预查询,其中我使用datalengh()函数来获取大型消息日志的大小,然后我使用ini_set动态增加odbc.defaultlrl值的大小,然后我执行查询以获取数据。它现在工作正常。