Я хочу отобразить прогресс функции PHP в моем веб-браузере. Одним из решений было бы поместить прогресс в базу данных и опросить его, пока функция AJAX ожидает ответа, но мне было интересно, есть ли лучший и более чистый способ сделать это.
Я смотрел в этот плагин который добавляет progress
обещают AJAX-вызов в jQuery, но он только поддерживает загрузку и загрузку.
Чтобы проиллюстрировать, чего я хотел бы достичь, мой вызов AJAX выглядит примерно так:
$.ajax({
type: 'POST',
dataType:'json',
url: ajaxUrl,
data: someData
}).progress(function(response) {
// Do something with progress messages
}).done(function(response) {
// Process complete
});
Допустим, он вызывает эту функцию в PHP:
public function heavy_lifting() {
echo json_encode( array( 'progress', 'Starting!') );
sleep(1);
echo json_encode( array( 'progress', 'Pfew') );
sleep(1);
echo json_encode( array( 'progress', 'Almost done!') );
sleep(1);
// Done!
echo json_encode( array( 'done', 'Process completed!') );
die();
}
Какой лучший способ сделать что-то подобное?
Лучшим подходом будет использование Websockets (трещотка
WebSockets для PHP)
Создайте сервер Websocket в PHP, затем зарегистрируйте этот Websocket на веб-странице, используя JavaScript
// Create WebSocket connection.
const socket = new WebSocket('ws://localhost:8080');
// Connection opened
socket.addEventListener('open', function (event) {
socket.send('Hello Server!');
});
// Listen for messages
socket.addEventListener('message', function (event) {
console.log('Message from server', event.data);
});
Всякий раз, когда есть изменение в прогрессе, тогда отправьте событие с сервера, которое будет получено JavaScript message
EventListener и выполнить вашу задачу после этого.
Подход Websocket лучше, чем опрос.
PHP имеет встроенный прогресс загрузки сеанса, посмотрите на http://php.net/manual/en/session.upload-progress.php