使用 AJAX 检查并显示 PHP 函数的进度

Check and display a PHP function's progress with AJAX

我想在我的网络浏览器中显示 PHP 函数的进度。一种解决方案是将进度放入数据库并在 AJAX 函数等待响应时对其进行轮询,但我想知道是否有更好更简洁的方法来执行此操作。

我研究了 this plugin,它向 jQuery 中的 AJAX 调用添加了 progress 承诺,但它似乎只支持上传和下载。

为了说明我想要实现的目标,我的 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 (Ratchet PHP)

的 WebSocket

在 PHP 中创建一个 Websocket 服务器,然后使用 javascript

在网页上注册该 Websocket
// 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 已在 Session 上传进度中构建,请查看 http://php.net/manual/en/session.upload-progress.php