PHP在运行进程时响应ajax

时间:2014-10-20 15:44:51

标签: php ajax

我已经尝试从PHP运行一个长脚本时从Ajax请求中获取一些数据;

但是当Ajax被回答为PHP中的脚本完成时,我需要在运行其他脚本时获得Ajax响应。

JS

setInterval(function(){
    $.post( 'progress.php','',
    function(data){
        $('.-info-').html(data);
    }); 
},100);

progress.php

session_start();
echo $_SESSION['progress'].'%';

running.php

session_start();
$i=0;
while($i<99){
    $i++;
    $_SESSION['progress'] = $i;
    //sleep(1);
    //flush();
}

"while"运行时有什么方法可以回应吗?

4 个答案:

答案 0 :(得分:1)

使用flush()将输出发送到浏览器和onreadystatechange以在客户端获取响应

$i=0;
while($i<99){
    $i++;
    echo $i; 
    flush();
    sleep(1);
}

onreadystatechange将从脚本调用wata的每个部分(http://www.w3schools.com/ajax/ajax_xmlhttprequest_onreadystatechange.asp

你应该检查状态3 - 状态3加载下载; responseText保存部分数据。所以你可以轻松使用它 - 你可以在这里查看developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest

答案 1 :(得分:1)

每次更新$_SESSION时,PHP都不会转储已保存会话数据的副本。当任何特定进程使用它时,PHP实际上会锁定会话文件。

您需要这样做:

while($i<99){
    session_start();  // start session
    $i++;
    $_SESSION['progress'] = $i;

    session_write_close();  // save session data, release session file lock

    sleep(...);
}

换句话说,您的代码将无法运行,因为您的running脚本会使会话保持打开/锁定状态,从而阻止progress访问它。

答案 2 :(得分:1)

编辑:Marc B是对的。会话将被锁定,不会根据需要进行更新。因此,您需要将进度存储在可以从多个连接异步访问的系统中 - 也许是数据库?

<强> running.php:

session_start();
$i=0;
while($i<99){
    $i++;
    // Store progress in Database
}

<强> progress.php:

 session_start();
 //read progress from Database

答案 3 :(得分:0)

您可以使用全局变量,但更好的是制作静态或单例类

class counter {
  private $_progress=0;

  public static function doProgress() {
    $i=0;
    while($i<99){
    $i++;
    $this->_progress = $i;
    }
  }

  public static function getProgress() {
    return $this->_progress;
  }

所以在进行中.php做

 echo Counter::getProgress()

在你的javascript中你必须在我的mermory中使用setinterval()函数来调用process.php脚本