我想在我的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();
}
做这样的事情的最佳方法是什么?
答案 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