我正在尝试使用 Javascript 或 JQuery 在 textArea 中打印报告,因为我想向用户展示 PHP 脚本在后台处理一段时间时发生了什么,因此用户不会认为应用程序挂起。
因此,我尝试使用 setTimeout(...) 自动更新 textArea,并在处理时通过 PHP 脚本在会话中设置报告值,以便在客户端获取该变量并将其打印在 textArea 中。
这是我使用的代码:
/*
* The client side javascript function that updates the textArea value.
*/
function updateReport() {
var reportValue = '<?php echo( $_SESSION[ 'report' ] ); ?>';
document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;
setTimeout(function () {
updateReport();
}, 500);
}
客户端通过 Ajax(JQuery) 请求调用的 php 脚本:
<?php
$report = "";
for( $i = 0; $i < $number_of_items_to_process; $i++ ) {
$report .= "- Processing a new item";
$_SESSION[ 'report' ] = $report;
// .... Process some long code here.
}
?>
但似乎 updateReport() 在第一次调用时只执行一次,然后在 PHP 脚本完成后恢复。
你能为我解释一下吗?
有没有办法完成我想要的?
---------------------------------->>更新:我用来尝试从服务器端获取 $_SESSION[ 'report' ] 的更新值的代码:
// 1. JavaScript :
function updateReport() {
$.ajax({
url: "test2.php",
type: "POST",
cache: false,
success: function( returned_value ){
var reportValue = $.trim( returned_value );
alert(reportValue); // All messages appear after PHP script ends.
}
});
setTimeout(function () {
updateReport();
}, 500);
}
// 2. test2.php(Script just made to get $_SESSION[ 'report' ]) :
<?php
if ( !isset( $_SESSION ) ) session_start();
echo( $_SESSION[ 'report' ] );
?>
当您访问一个 php 站点(例如 test)时.php它会从服务器转换为 html 并发送到您的网络浏览器。
所以:
function updateReport() {
var reportValue = '<?php echo( $_SESSION[ 'report' ] ); ?>';
document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;
setTimeout(function () {
updateReport();
}, 500);
}
将在网络浏览器中(您可以在Firebug或chrome开发工具中查找):
function updateReport() {
var reportValue = '';
document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;
setTimeout(function () {
updateReport();
}, 500);
}
因为当您访问该网站时,$_SESSION['报告'] 是空的。
执行 ajax 请求时,调用服务器上的代码。当您设置 $_SESSION['报告'] 时,它会在服务器上设置。但是客户端无法获得该信息,因为客户端(您的Web浏览器)不知道PHP是什么。它只是一遍又一遍地设置一个空字符串,因为它只在页面请求处获取生成的 html(来自 PHP 文件)。
您必须发出额外的 Ajax 请求才能从 $_SESSION['report'] 向客户端获取新值。
虽然您可以使用HTTP流来执行此操作,但我会选择一种不同的方法来解决此问题。
由于所有项目的处理都需要时间,因此应通过后台进程完成。在 PHP 中,您可以使用 pcntl_fork()
.
首先,您必须开始处理:
- 检查文件
foobar.pid
是否存在 - 如果文件不存在,请创建它,否则 - 转到 9
- 从队列中选取下一项
- 处理物料
- 如果
foobar.pid
包含"杀戮",则转到 8 - 如果队列为空:转到 8
- 转到 3
- 删除文件
foobar.pid
- 结束
这将导致后台进程检查,已经存在一个这样的进程。此外,它还使您能够通过将"kill"放入文件中来停止循环。
那么..报道呢?作为处理的一部分,您应该具有后台服务来将状态消息写入某个status.txt
文件。
然后,您的 XHR(营销人员称之为 - AJAX)脚本可以读取此文件。同样的JavaScript代码可以检查是否完成了所有项目的处理(因为foobar.pid
文件已经消失)。
试试这个怎么样:
- http://www.silverspider.com/2005/php-progress-bar/
- http://www.redips.net/javascript/ajax-progress-bar/- 这个有一个功能演示,您可以在其中看到进度条加载...