【问题标题】:PHP Jquery Ajax call throws net::ERR_EMPTY_RESPONSEPHP Jquery Ajax 调用抛出 net::ERR_EMPTY_RESPONSE
【发布时间】:2014-04-12 14:36:14
【问题描述】:

我在页面中有以下 JavaScript 代码。进行 ajax 调用时,我可以看到浏览器检查/调试器部分抛出 net::ERR_EMPTY_RESPONSE 错误。它在 localhost 环境中运行良好,但在生产中抛出上述错误。

在客户端代码中,

<script>
$(document).ready(function(){
    $("#identityLinks a").on("click", function(){
    value = $(this).attr("id");
    if(value != "")
    {
        $.ajax({
            url:  "publish/updateUsersData.php",
            type: "POST",
            data: {receiverId: value},
            contentType: "application/x-www-form-urlencoded; charset=UTF-8",
            dataType: "json",
            success: function(data) {
              //alert(data["result"]);
              console.log(data["result"]);
            },
            error: function(xhr, textStatus, errorThrown) {
               //alert(xhr +" "+ textStatus +" "+errorThrown);
               console.log(xhr +" "+ textStatus);
            }
        });
    }
    });
</script>

在服务器端代码 (PHP) 中,我在 updateUsersData.php 中有以下代码:

<?php
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 01 Jan 1996 00:00:00 GMT');
header('Content-type: application/json; charset=UTF-8');
if(isset($_POST["receiverId"]))
{
    $receiver_id = trim($_POST["receiverId"]);
    $arr = array("result"=>$receiver_id);
    echo json_encode($arr); die();
    break;
}
else
{
    $arr = array("result"=>"No user data received. Error!");
    echo json_encode($arr); die();
    break;
}
?>

您认为这是由于带有 Expire 调用的标题还是 Jquery 1.9.1 版本中的错误?当我们是以前的版本时,我没有发现这样的错误。此外,这段代码已经有 5 个月没有更新了,浏览器错误就在不久前蔓延。感谢您的所有帮助和支持。

编辑:

状态:这个ISSUE目前尚未解决。 Jquery AJAX 需要专家的帮助。任何人,请宣传这个问题。此外,CORS 不对这个问题负责。

点击出现上述错误的控制台时,我直接被带到了这一行

JQuery 1.9.1 where console error lines point to:

=> xhr.send( ( s.hasContent && s.data ) || null );

Also these ones are shown in console error mark:

=> transport.send( requestHeaders, done );

=> ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle 
   || handleObj.handler )
  .apply( matched.elem, args );

=> return typeof jQuery !== core_strundefined && 
(!e || jQuery.event.triggered !== e.type) ?
jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : undefined;

jquery 最新版本是否会导致此 PROVISIONAL HEADERS ARE SHOWN 错误。

【问题讨论】:

  • 有任何线索可以解决这个问题或需要更多信息吗?
  • 我正在回复您留下的评论 here。我认为您的问题不是“显示临时标头” 消息。据我所知,该消息并不代表错误,只是表明 Chrome 尚未收到该请求的真实标头。
  • 您提到的 net::ERR_EMPTY_RESPONSEProvisional Headers Sent - No actual request sent 错误应该与您的问题更相关。我们是否有可能看到您的系统正在运行?看来问题不在于代码,而在于客户端-服务器连接。
  • 我在这里没有想法,所以我只想问一些简单的问题,希望能有所收获:)。您正在使用相对 URL 作为 Ajax 调用的参数。根据您的配置,该 URL 在生产和开发中可能会有不同的解释。您确定请求是在正确的位置发出的吗?
  • 感谢@wvega 花时间研究这个问题。是的,正如您所说,代码中似乎没有问题。它实际上在 localhost 中运行良好,但会引发 生产中的错误。我还交叉检查了 URL,它指向正确的位置。我仍然很困惑为什么会发生这种情况。 支持这个问题(它变得更加明显)因为这对许多开发人员来说是一个麻烦,我看到很多帖子发布了类似的问题。

标签: php jquery ajax google-chrome


【解决方案1】:

我相信您的请求不属于 CORS 规范下的“简单请求”:

http://www.w3.org/TR/cors/#simple-cross-origin-request-0

因为您正在为 Content-Type: application/json 设置响应标头。

因此,您的服务器将需要处理预检请求,这涉及在请求和响应中设置一些额外的标头,以使 CORS 请求成功

这是一篇关于您需要做什么的好文章 - 请查看“不那么简单”下的内容:

http://www.html5rocks.com/en/tutorials/cors/

【讨论】:

  • 非常感谢您指出跨域资源共享 (CORS)。我将检查选项以查看问题是否解决。需要注意的另一件事是我们在本地主机环境中没有任何问题。一切正常。此问题仅在生产中出现。
  • 我们还在客户端和服务器端声明了 json 数据类型。真不知道问题出在哪里。此代码符合 Jquery 文档,但它会引发临时标头已发送 - 没有实际请求已发送错误。如果有人可以在代码/其他地方发现错误?
【解决方案2】:

因此,无论使用何种语言或技术,都可能出于多种原因发生这种情况。我遇到过这种情况,使用角度资源来回发送 15-20 个数据点的极小有效载荷。 PHP、Jquery、Angular 都以不同的方式处理错误,但结果只是发生了三件事之一。

  1. 延迟或网络问题,我在极慢的连接上发生过这种情况,这可能是由于路由器故障或防火墙配置不正确造成的保护您免受病毒侵害的地方。

  2. 高服务器负载,我已强制服务器在压力测试中处于 100% cpu,这将发生在随机调用上,因为服务器处理请求的速度不够快。这很难解决,而且确实是系统的扩展问题。

  3. 庞大的数据集,发送的大型项目导致响应失败,通常可以通过调整您使用的任何 Web 服务器上的超时设置来解决此问题。

【讨论】:

    【解决方案3】:

    我的页面有时也有同样的问题。 我认为这是因为变量的数量或变量的大小。 我有一个页面发送大约 250 个变量的 json 没有任何问题,但是这个错误发生在这个页面中,而大约 1500 个变量将被发送。这个问题是新的。以前,即使有 3000 个变量,每件事都没有问题。 在最近的版本中,我在 chrome 和 firefox 中都会出现这个问题。 这不是服务器端错误,因为我已将 apache 配置为恢复 30 Mb 数据的 100 万个变量。

    【讨论】:

      【解决方案4】:

      我遇到了同样的错误,并且能够通过将我需要在一个数组中处理的所有数据发送到服务器来修复它,然后让它将更新的数组吐回客户端,这样只有一个 AJAX 调用制作完成。

      我无法确定这个问题的确切原因,但我很确定发生了什么是某种缓冲区被所有这些 AJAX 调用填满,导致服务器关闭了一些这些请求。

      希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        我最近使用 AJAX XMLHttpRequest() 作为函数也遇到了同样的错误

        function sysAJAX(inUrl,inData){
            return  $.ajax({type:"POST", url: inUrl, data: inData, cache:false,timeout:0, success:function(feed){},error:function(XMLHttpRequest,textStatus,errorThrown){}});
        }
        

        就我而言,这是 PHP 的服务器端问题。我发现 json_encode() 传输的数据太大,超出了 PHP 的内存限制。 正如@Hasan Wajahat 所建议的,调整内存限制对我来说不是一个好主意,所以我查看了将由 json_encode 发送的全部数据,这解决了问题。

        【讨论】:

          【解决方案6】:

          由于我的网络问题,我发现了同样的问题,可能是您的网络也导致了这个问题。

          【讨论】:

            【解决方案7】:

            我在使用 XMLHttpRequest() 时也遇到了同样的错误。

            但是,我能够通过在服务器端禁用脚本的内存限制来解决该错误。

            这是通过在 php.ini 文件中将 memory_limit 设置为 -1 来完成的。默认情况下它设置为 128M,因此您也可以尝试增加内存大小而不是完全禁用它,因为它可能会占用大量服务器资源。

            【讨论】:

              【解决方案8】:

              在大多数情况下,我已经能够通过一个简单的函数来解决这个问题,我编写了一个简单的函数来转储/重置所有垃圾内存并在任何/所有循环之后刷新/重置输出内存。

              function memes(){
                ob_flush();
                ob_end_flush();
                gc_collect_cycles();
                ob_start();
                gc_enable();
              }
              

              【讨论】:

                【解决方案9】:

                我有同样的问题。我尝试了许多解决方案建议,但没有任何效果。最后我能够通过使用 Ajax Get 方法而不是 post 来解决这个问题。但如果您不发送敏感数据,则更喜欢这个。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-05-26
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-02-06
                  • 2016-04-16
                  • 1970-01-01
                  • 2021-06-30
                  相关资源
                  最近更新 更多