【发布时间】:2012-09-13 20:50:20
【问题描述】:
我有一个服务器端 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 的一位开发人员得到了一个 null 对象返回,而我只是得到一个具有空属性的对象。我们本地服务器的 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 之上),所以它可能有自己的默认超时指令,它在其内部 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 和其他所有人的支持。
【问题讨论】:
-
它返回一个空对象还是什么都不返回?服务器生成和服务这些较大的对象需要多长时间(大约)?
-
Firebug for Firefox 让您准确了解发送回浏览器的内容以及发送时间。
-
@Ben D - 在我的情况下,对象只是空的。但是,我的一位开发人员运行相同的 URL 查询却一无所获。
-
它可能是您可以通过 POST 或 GET 仅发送/发布有限大小的对象,除非您将其指定为
-
问题 2:您的网络服务器是什么(apache、iis 等)?
标签: php javascript jquery json web-applications