我有一个服务器端 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) 结果对象正在使用json_encode($data, JSON_FORCE_OBJECT)
PHP 端正确编码为 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 核心文档,Timeout 指令的默认值为 300 秒,尽管正如我上面提到的,我使用 Zend Server CE 作为我的开发服务器(它位于 Apache 之上),所以它可能有自己的默认超时指令,它在其内部 Apache 配置中设置。再次,我将不得不检查。
还要澄清一下,我在这个软件项目上的合作伙伴也遇到了同样的问题,只是他没有返回一个空对象,而是返回了 null。
更新 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 和其他所有人的支持。