【问题标题】:Server-side object in PHP is empty when returned to clientPHP中的服务器端对象返回给客户端时为空
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢 Ben,我现在在学校,但明天我会回来工作。我将在早上浏览这些项目中的每一个,然后进行更新。再次感谢您的意见。
【解决方案2】:

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

$.ajax({.... data: { firstName: "bob", lastName: "smith" } });

【讨论】:

  • 虽然我同意你的观点,但我不明白这如何解决问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多