PHP Jquery Ajax вызывается сетью:: ERR_EMPTY_RESPONSE

У меня есть следующий код 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 месяцев, а ошибки браузера ползут только некоторое время назад. Спасибо за вашу помощь и поддержку.

Edit:

Статус. Этот 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 A SHOWN.

Ответ 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/

Ответ 2

У меня такая же проблема на моей странице иногда. Я думаю, что это происходит из-за количества переменных или насколько они велики. У меня есть страница, которая отправляет json из около 250 переменных без каких-либо проблем, но эта ошибка возникает на этой странице, тогда как должно быть отправлено около 1500 переменных. Эта проблема новая. Раньше каждая вещь даже с 3000 переменными была без проблем. Эта проблема возникает для меня как в хроме, так и в firefox в последних версиях. Это не ошибка на стороне сервера, потому что я настроил apache для восстановления 1 миллиона переменных из 30 Мб данных.

Ответ 3

У меня была такая же ошибка, и я смог ее исправить, отправив все данные, которые мне нужно обработать в массиве, на сервер, а затем перебросил обновленный массив обратно клиенту, так что только один вызов AJAX.

Я не смог определить точную причину этой проблемы, но я уверен, что происходит то, что какой-то буфер заполняется до всех этих вызовов AJAX, заставляя сервер закрывать некоторые этих запросов.

Надеюсь, что это поможет.

Ответ 4

Таким образом, это может произойти по ряду причин, независимо от используемого языка или технологии. Я столкнулся с этим с чрезвычайно малыми полезными нагрузками из 15-20 точек данных, отправляемых туда и обратно с использованием ресурса angular. PHP, JQuery, angular все обрабатывают ошибку по-разному, но результаты достигают одной из трех вещей.

  • Задержки или проблемы с сетью, я это делал на чрезвычайно медленных подключениях, опять-таки это может быть что угодно плохому маршрутизатору или неправильной конфигурации брандмауэра, чтобы просто на дрянной сети, на такие программы, как avast, которые помещают прокси в место, чтобы защитить вас от вирусов.

  • Высокая загрузка сервера, я заставил сервер быть на 100% процессор от стресс-тестирования, и это будет происходить на случайных вызовах, потому что сервер недостаточно быстро передает запросы. Это трудно исправить и действительно является проблемой масштабирования для системы.

  • Огромные наборы данных, большие отправленные сообщения, которые откликаются, обычно это можно устранить, настроив параметры таймаута на любом веб-сервере, который вы используете.

Ответ 5

Я нашел такую ​​же проблему из-за моей сетевой проблемы, возможно, ваша сеть также вызвала это.

Ответ 6

Я также получал ту же ошибку при использовании XMLHttpRequest().

Однако мне удалось устранить ошибку, отключив ограничение памяти для script на стороне сервера.

Это делается путем установки memory_limit в -1 в файле php.ini. По умолчанию установлено значение 128M, поэтому вы можете также попытаться увеличить размер памяти, а не полностью отключить ее, так как это может занять много ресурсов сервера.

Ответ 7

Мне удалось решить эту проблему в большинстве случаев с помощью простой функции, которую я написал в dump/ reset всю память мусора и flush/reset выходную память после любых/всех циклов.

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