2017-02-12 3 views
2

Я пытаюсь получить какой-то живой результат из запроса AJAX.JQuery AJAX в прямом эфире?

Это код, я использую:

$.ajax({ type: "GET", 
    url: "test.php?delete=students", 
    async: true, 
    success : function(data) { 
     console.log(data) 
    } 
    }); 

При срабатывании по ссылке на моем веб-странице спиннинг анимации показано, чтобы показать, что что-то происходит. Я также хотел бы показать в файле div результат от test.php, когда он запущен.

test.php имеет простой цикл, который перебирает все студент и удаляет их, а затем echo "$student removed";

При запуске из командной строки абсорбция показана, при запуске через AJAX я только получить не анимацию вывод ,

Я не уверен, как это получить, я пробовал пару плагинов с большим успехом. Я также пытался использовать XMLHttpRequest и responseText, но я не уверен, как правильно это использовать.

В идеале я хотел бы, чтобы каждое удаление отображалось в div #status.

Может ли кто-нибудь посоветовать, как это сделать?

UPDATE

progress : function(data) { 
    console.log(data); 
}, 

Я добавил выше, и двигаться я получаю некоторый вывод в консоли. ProgressEvent {isTrusted: true, lengthComputable: false, loaded: 44, total: 0, type: "progress"…}

Расширение того, что я могу видеть ответ, который содержит данные, которые мне нужны. Как это получить, чтобы добавить его в div?

+0

Если я прав, «успех» в AJAX вызывает обратный вызов только после того, как php закрывает HTTP-соединение, я сам смущен, поэтому надеюсь на большее количество ответов. – Pbd

+0

Привет. 'success' действительно возвращается правильно, я пытаюсь получить результат, как это происходит. Как раз для того, чтобы обновить свое исходное сообщение – Tom

+0

, я хочу сказать, что вы не можете передать ход tets.php, браузер не будет читать его до тех пор, пока соединение php не будет закрыто. – Pbd

ответ

0

Вы можете попробовать с помощью событий сервера посланный для него: https://html.spec.whatwg.org/multipage/comms.html#server-sent-events

Клиентский код будет просто:

var sse = new EventSource('test.php?delete=students'); 
sse.addEventListener('message', function(e) { 
    console.log(e.data); 
}, false); 

В вашем test.php код будет выглядеть примерно следующим образом:

header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

for ($i = 0; $i < ob_get_level(); $i++) {//for each open buffer 
    ob_end_flush();//close it 
} 

ob_implicit_flush(1);//turn implicit flush on 

//now goes what you called "loops through all students and deletes them" 
while(1) { 
    /*here you post your code that deletes your student*/ 
    $data = "$student removed";//message to send to client confirming deleting of particular student 
    echo "data: ".$data . PHP_EOL;//here you send data to client, it will receive it and handle inside 'message' event handler 
    echo PHP_EOL;//need this just to fulfill the SSE standard 
    sleep(1);//use if need to insert pause between sending new portion of data (better use it to keep your browser safe from too much of messages per second) 
} 

Не забудьте разбить петлю после окончания удаления студентов =)

+0

Привет, спасибо за это. Я попробую это позже сегодня - будет ли проблема с тайм-аутами? если test.php принимает x mins для завершения, это вызовет какие-либо проблемы? он может удалить или обновить 100 000 записей. – Tom

+0

Если соединение падает, EventSource пытается его снова открыть. Таким образом, вам нужно только убедиться, что ваша серверная логика перестает выполняться, если удаленный клиент отключается (проверьте, что ваш «ignore_user_abort» установлен на «off» в php.ini, если с ним возникнут какие-либо проблемы) и продолжается с последней операции после повторного открытия соединения. Вы также можете использовать обработчик событий «error» на стороне клиента, чтобы уведомить клиента, если что-то пойдет не так. Проверьте ссылку в своем ответе, чтобы получить дополнительную информацию об этом. –

+0

Извините, мне просто удалось вернуться к этому. Я получаю сообщение об ошибке «Ответ от EventSource имеет тип MIME (« text/html »), который не является« text/event-stream ». Отмена соединения. ' – Tom