如何在处理PHP脚本时用Javascript打印报告


How can i print a report in Javascript while processing PHP script?

我正在尝试使用 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() .

首先,您必须开始处理:

  1. 检查文件foobar.pid是否存在
  2. 如果文件不存在,请创建它,否则 - 转到 9
  3. 从队列中选取下一项
  4. 处理物料
  5. 如果foobar.pid包含"杀戮",则转到 8
  6. 如果队列为空:转到 8
  7. 转到 3
  8. 删除文件foobar.pid
  9. 结束

这将导致后台进程检查,已经存在一个这样的进程。此外,它还使您能够通过将"kill"放入文件中来停止循环。

那么..报道呢?作为处理的一部分,您应该具有后台服务来将状态消息写入某个status.txt文件。

然后,您的 XHR(营销人员称之为 - AJAX)脚本可以读取此文件。同样的JavaScript代码可以检查是否完成了所有项目的处理(因为foobar.pid文件已经消失)。

试试这个怎么样:

  1. http://www.silverspider.com/2005/php-progress-bar/
  2. http://www.redips.net/javascript/ajax-progress-bar/- 这个有一个功能演示,您可以在其中看到进度条加载...