我有一个服务器端PHP脚本,用于生成一个包含数据库聚合数据的对象。该脚本构建对象,将其编码为JSON并将其返回给客户端,其中原始请求由此jQuery.ajax调用完成:
$.ajax({
async: false,
url: 'scripts/getDataforUser.php?firstName=' + _firstName+ '&lastName=' + _lastName,
dataType: "json",
success: function(result) {
//Do stuff with 'result' object
//result object sometimes comes back empty
},
error:function (xhr, ajaxOptions, thrownError){
displayError('An error occurred while fetching data');
return;
}
});我的问题是,我偶尔会得到一个返回的空结果对象,这似乎发生在更大的请求中,但看起来是随机的,所以追踪原因一直是一个挑战。我将Zend Server和Eclipse一起用作IDE,我已经多次调试脚本以确认A)存在数据,并且B)使用PHP侧的json_encode($data, JSON_FORCE_OBJECT)将结果对象正确编码为JSON。
同样,这个错误似乎只发生在较大的对象上,因为我可以直接调试getDataforUser.php脚本时看到数据,所以我专注于客户端并查看是否在Javascript端收到错误。
在这一点上,我不确定从服务器到客户端的翻译会有什么损失。我是如何编码PHP中的对象的JSON的问题?我如何调用服务器来获取该编码对象?两者的结合?还是有更重要的东西我失踪了?
更新:
嗨Ben,正如我的评论所述,我忽略了一个细节,在我的原始文章中可能会提供一些有关该问题的见解,是一位在其本地开发人员服务器上运行相同URL的同伴获得返回的空对象,而我只需获得一个空属性的对象。我们的本地服务器的PHP配置是否会成为问题?在我的PHP.ini文件中,我对资源限制有以下设置,在这种情况下,我预计这将足够多。
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 600 ; Maximum execution time of each script, in seconds
max_input_time = 180 ; Maximum amount of time each script may spend parsing request data
memory_limit = 128M ; Maximum amount of memory a script may consume (128MB)从直接调试脚本开始,脚本执行此查询所用的时间不超过600秒。它在时间限制内很好地解析了请求数据,并且没有发生关于内存耗尽的错误。
更新2:
我的开发环境正在运行Apache Web服务器。
更新3:
@Ben - 我快速浏览了Apache core documentation,Timeout指令的默认值是300秒,但正如我上面提到的,我使用Zend Server CE作为我的开发服务器(它位于Apache之上),所以它可能有它的拥有默认的Timeout指令,它在其内部的Apache配置中设置。再次,我必须检查。
也只是为了澄清,我的这个软件项目的合作伙伴有同样的问题,只是而不是回收一个空的对象,他回到空。
更新4:
好的,我在本地Web服务器上进行了大量测试和验证。与之相关的一个细节是我查询的数据库托管在MS SQL Server上,我将SQL Server Native Client PHP Driver用作我的数据库抽象层。无论如何,在查看日志之后,我发现SQL Native Client报告了以下情况,数据查询超时:
[0] => Array
(
[0] => 08S01
[SQLSTATE] => 08S01
[1] => 258
[code] => 258
[2] => [Microsoft][SQL Server Native Client 11.0]TCP Provider: Timeout error [258].
[message] => [Microsoft][SQL Server Native Client 11.0]TCP Provider: Timeout error [258].
)
[1] => Array
(
[0] => 08S01
[SQLSTATE] => 08S01
[1] => 258
[code] => 258
[2] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
[message] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
)
[2] => Array
(
[0] => 08S01
[SQLSTATE] => 08S01
[1] => -2147467259
[code] => -2147467259
[2] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
[message] => [Microsoft][SQL Server Native Client 11.0]Communication link failure
)这似乎是结果对象中空数据的主要来源,我仍在搜索有关此错误的信息,我不确定是否需要更新的超时设置位于SQL Server Native Client本身中或位于数据库。需要更多的调查。
更新5:
我排除了数据库超时,远程连接超时设置设置为600秒。我在网上阅读过使用PDO ODBC驱动程序是首选的,因为超时似乎没有问题。我要试一下,看看它是否解决了这个超时问题。
最终更新分辨率:
好的,所以切换到PDO驱动程序似乎解决了我的超时问题,我验证了在本地开发机器和分段服务器上工作的PDO驱动程序。我仍然不确定在使用SQLSRV驱动程序时会导致SQL Server Native Client超时。现在我会将主要问题标记为已解决,因为我现在正在取回数据。感谢Ben D和其他人的支持。