Javascript PHP+;Ajax:在长时间运行脚本之前获取唯一字符串
我知道这是一个常见的问题。 长话短说:我将在长时间运行脚本期间向用户显示进度 这是我的代码/想法:将“进度”存储在mysql中,以便Ajax可以读取它(当然是通过PHP)Javascript PHP+;Ajax:在长时间运行脚本之前获取唯一字符串,javascript,php,jquery,ajax,Javascript,Php,Jquery,Ajax,我知道这是一个常见的问题。 长话短说:我将在长时间运行脚本期间向用户显示进度 这是我的代码/想法:将“进度”存储在mysql中,以便Ajax可以读取它(当然是通过PHP) “progress()”是“长时间”运行的脚本测试: public function startProgress() { $this->unique = sha1(session_id().uniqid().time()); echo json_encode($this->unique);
“progress()”
是“长时间”运行的脚本测试:
public function startProgress()
{
$this->unique = sha1(session_id().uniqid().time());
echo json_encode($this->unique);
$this->progress();
}
public function progress()
{
for($i=1;$i<=10;$i++)
{
$this->progress = $i;
$this->setProgress();
sleep(1);
}
}
private function setProgress()
{
$progress = array('tot'=>10,'current'=>$this->progress);
$args['service'] = $this->unique;
$args['progress'] = json_encode($progress);
$progress_service = New ProgressService();
$progress = $progress_service->getProgress($args['service']);
if ($progress!=null)
{
$args['id'] = $progress[0]->id;
}
$progress_service->setData($args);
}
公共函数startProgress()
{
$this->unique=sha1(session_id().uniqid().time());
echo json_encode($this->unique);
$this->progress();
}
公共职能进展()
{
对于($i=1;$iprogress=$i;
$this->setProgress();
睡眠(1);
}
}
私有函数setProgress()
{
$progress=array('tot'=>10,'current'=>$this->progress);
$args['service']=$this->unique;
$args['progress']=json_encode($progress);
$progress_service=新的ProgressService();
$progress=$progress\u service->getProgress($args['service']);
如果($progress!=null)
{
$args['id']=$progress[0]->id;
}
$progress\u service->setData($args);
}
基本上我的想法是:
1) 生成唯一字符串($this->unique=sha1(session_id().uniqid().time());
2) 存储以供参考(在saveData中使用),用JSON编码并输出到javascript/jquery,这样我就可以使用它通过Ajax启动另一个脚本来搜索数据库
我的问题是回音只有在进度结束后才输出(~10秒,使用
$i您要查找的函数可能是。在echo
之后立即调用该函数。这样做的目的是尝试在脚本完成之前立即将所有输出发送到浏览器。这里要记住的是,连接可能会保持打开状态,因此在浏览器中,它会ght快速返回JSON,但请求不会完成
更好的选择可能是向服务器发出请求以获取唯一的id,然后发出另一个请求以使用之前收到的id启动长时间运行的进程。因此,首先调用preps,然后执行第二个。我对PHP不太熟悉,但过去在Java中也做过类似的事情。您确定没有这样做吗事务问题,即在与您的处理相同的事务中,在DB中写入的进度,因此在事务完成之前,该进度不可供其他线程读取?