0

我正在尝试使用 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' ] );
?>
4

3 回答 3

2

当您访问一个 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);
}

将在 webbrowser 中(您可以在 firebug 或 chrome dev 工具中查找):

function updateReport() {
    var reportValue = '';
    document.forms[ 'start_send_form' ].elements[ 'reportTextArea' ].value = reportValue;

    setTimeout(function () {
        updateReport();
    }, 500);
}

因为当您访问该站点时,$_SESSION['report'] 是空的。

当您执行 ajax 请求时,您会调用服务器上的代码。当您设置 $_SESSION['report'] 时,它会在服务器上设置。但是客户端没有获得该信息,因为客户端(您的网络浏览器)不知道 PHP 是什么。它只是一遍又一遍地设置一个空字符串,因为它只在页面请求时获得了生成的 html(来自 PHP 文件)。

您必须发出额外的 Ajax 请求才能从 $_SESSION['report'] 向客户端获取新值。

于 2012-06-12T09:46:53.537 回答
1

虽然您可以使用HTTP Streaming来执行此操作,但我会选择一种不同的方法来解决此问题。

由于处理所有项目都需要时间,因此应该由后台进程完成。在 PHP 中,您可以使用pcntl_fork().

首先,您必须开始处理:

  1. 检查文件是否foobar.pid存在
  2. 如果文件不存在,则创建它,否则 -转到9
  3. 从队列中选择下一个项目
  4. 处理项目
  5. 如果foobar.pid包含“kill”,则转到8
  6. 如果队列为空:转到8
  7. 转到3
  8. 删除文件foobar.pid
  9. 结尾

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

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

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

于 2012-06-12T09:50:49.820 回答
0

试试这个怎么样:

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