1

我有一个服务器端 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 和其他所有人的支持。

4

2 回答 2

0

问题的三个明显来源:它要么是返回 ajax 请求的问题,要么是被调用的 PHP 脚本的问题,或者是服务于 php 结果的网络服务器。我猜这是一个PHP问题,但要彻底:

您的$.ajax()请求可能超时,因为即使 jquery 没有默认超时,不同的浏览器似乎在 ajax 请求上设置了自己的超时] 1。这可能会因async: false设置而变得更加复杂,尽管我不确定。我猜不是这样,因为我认为浏览器超时会触发 ajax 错误子句,并且您在评论中注意到有人能够直接从 URL 复制,但很容易确保使用 firebug(或等效) 并观察交通情况。

它是 PHP 问题的可能性要高得多。需要检查的几件事: 1. PHP 脚本没有超时(max_execution_time在 ini 文件中)或达到内存上限(memory_limit在 ini 中)。还要确保您不会意外地尝试对非 utf8 字符进行编码,并且您只是碰巧在大对象中击中它们(在这种情况下json_encode()会返回null)。尝试打开错误,查看是否生成任何错误,并尝试运行json_last_error()以查看创建 json 字符串是否有问题。

最后,Apache 可能是问题所在。您的请求看起来很小,所以我怀疑它是否达到了任何请求 url 限制,但是在等待 php 创建对象时,Web 服务器可能会超时...检查TimeOut您的 http.conf 文件中的值。

于 2012-09-13T22:18:15.023 回答
-1

不要通过 URL 传递 GET 参数。改用“数据”属性:

$.ajax({.... data: { firstName: "bob", lastName: "smith" } });
于 2012-09-13T20:58:46.157 回答