使用 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
我想在我的网络浏览器中显示 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