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

在我的php应用程序中执行odbc_结果调用时接收HTTP 500内部服务器错误,php,sql,odbc,Php,Sql,Odbc,在通过fast cgi使用php时,我已经回顾了许多关于HTTP 500的原因的线程,但我发现没有一个线程与odbc_结果调用相关,并且根据可能从结果集中提取的数据的大小或内容,这些线程是断断续续的 我的php代码如下所示: $sql = "select [errorSummary],[messageLog],[scanType],[runName] FROM [SDITriage].[dbo].[SourceJobs] Where id = $sourceJob

在通过fast cgi使用php时,我已经回顾了许多关于HTTP 500的原因的线程,但我发现没有一个线程与odbc_结果调用相关,并且根据可能从结果集中提取的数据的大小或内容,这些线程是断断续续的

我的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退出SQLExtendedFetch,返回代码为1 SQL_SUCCESS_与信息HSTMT 0x01FA9968 UWORD 1 SQLLEN 1 SQLULEN* 0x0118E9EC 1 UWORD*0x0118E9F8 5

  DIAG [01004] [Microsoft][ODBC SQL Server Driver]String data, right
  DIAG [01004] [Microsoft][ODBC SQL Server Driver]String data, right
  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
在这一点上,我不确定是ODBC导致了崩溃还是php本身。任何帮助都将不胜感激

谢谢,
Chris

原来问题出在php odbc.defaultlrl设置上。如果我的数据小于该值的大小,则一切正常。如果它稍微大一点,就不会崩溃,但输出中包含的垃圾看起来很像缓冲区过度读取。如果数据大得多,php-cgi.exe就会崩溃

我采用的方法是直截了当的。我做了一个预查询,其中我使用datalengh函数来获取大消息日志的大小,然后我使用ini_set动态增加odbc.defaultlrl值的大小,然后我执行查询来获取数据。它现在运行良好