我已经尝试从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"
运行时有什么方法可以回应吗?
答案 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脚本