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

时间:2017-01-31 16:31:03

标签: php jquery ajax promise progress

我想在我的webbrowser中显示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();

}

做这样的事情的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

更好的方法是使用Websockets(Ratchet PHP的WebSockets)

用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方法优于民意调查。

答案 1 :(得分:1)

PHP已构建会话上载进度,请查看http://php.net/manual/en/session.upload-progress.php