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

标签 php javascript jquery json web-applications

我有一个服务器端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的同一个开发人员会得到一个空对象,而我只是获得一个具有空属性的对象。可能是我们本地服务器的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驱动程序作为数据库抽象层。无论如何,在查看日志后,我发现对数据的查询正在超时,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值是什么文件。

关于php - 返回客户端时,PHP中的服务器端对象为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12414577/

相关文章:

php - 清理 HTML 格式的内容以便在 Flash 中显示?

php - for循环内的PHP switch语句

javascript - Javascript 数组中最后一项后的换行符

javascript - JQuery 算术变量被视为字符串

javascript - 获取图片尺寸(高和宽)Js或jquery

javascript - 根据其他类中的选定字段将 displayNone 应用于特定类

php - Bootstrap 崩溃和 id

php - 用 php 为 Asterisk AMI 分离部分 fread 输出

javascript - 列内的绝对位置

javascript - .attr 选择器在each 循环中不起作用?