繁体   English   中英

返回客户端时,PHP中的服务器端对象为空

[英]Server-side object in PHP is empty when returned to client

我有一个服务器端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)将结果对象正确编码为JSON。 PHP方面。

同样,此错误似乎只发生在较大的对象上,因为在直接调试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配置中设置了自己的默认超时指令。 同样,我将不得不检查。

还要澄清一下,我在该软件项目上的合作伙伴遇到了同样的问题,只是他没有得到空对象,而是得到了空值。

更新4:

好的,我正在本地Web服务器上进行了广泛的测试和验证。 一个相关的细节是我查询的数据库托管在MS SQL Server上,我使用SQL Server Native Client PHP驱动程序作为数据库抽象层。 无论如何,在查看日志后,我发现对数据的查询正在超时,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和其他所有人的支持。

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM