Отправить результаты AJAX, но продолжить обработку в PHP - PullRequest
4 голосов
/ 22 декабря 2010

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

Итак, я пытаюсь найти способ отправки результатов AJAX и все еще продолжаю обработку на стороне сервера. Мое исследование выявило функцию ignore_user_abort, но, видимо, я не правильно ее использую.

Это руководство - это то, на чем я основываю свой код.

Вот мой javascript (Jquery):

 $.ajax({
            type: "GET",
            url: "ajax.php",
            data: { "mydata": mydata },
            success: function(msg) {
                    $("span#status").fadeOut(200, function() {
                            $("span#status").html(msg);
                            $("span#status").fadeIn(200);
                    });

            }
    });

И мой PHP:

    $response = "This is my response";

    //Begin code from link
    ob_end_clean();
    header("Connection: close");
    ignore_user_abort(true);
    ob_start();
    echo $response;
    header("Content-Length: " . mb_strlen($response));
    ob_end_flush();
    flush();
    //End code from link

    echo "I should not see this text";

К сожалению, я вижу этот текст после сброса ();

Есть идеи?

Обновление - Исправлено: Я разобрался в своей ошибке. После того, как я дословно скопировал кучу разных предложений кода, я понял, что в моей конфигурации apache / php произошла ошибка. Оказывается, мне нужно добавить две строки, чтобы заставить apache не буферизовать мои результаты:

apache_setenv('no-gzip', 1);
ini_set('zlib.output_compression', 0);

Ответы [ 2 ]

0 голосов
/ 08 января 2015

PHP-скрипт не может сказать браузеру закрыть соединение и не ждать дальнейших данных. Использование flush(); только отправляет текущий вывод по цепочке на веб-сервер, но не гарантирует, что он немедленно попадет в браузер. Веб-сервер может кэшировать вывод до тех пор, пока скрипт PHP не завершит выполнение.

Как пишет OP в последнем абзаце, решение состоит в том, чтобы настроить Apache, чтобы не буферизовать результаты.

0 голосов
/ 22 декабря 2010

Ну, вы увидели бы это , не так ли? Вы сказали, что эхо !

На полном серьезе, твой пример должен сработать. Похоже, что код выполняется после сброса, поэтому вы должны иметь возможность сделать запись в журнал, если сброс отправил запрос в браузер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...