Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript PHP+;Ajax:在长时间运行脚本之前获取唯一字符串_Javascript_Php_Jquery_Ajax - Fatal编程技术网

Javascript PHP+;Ajax:在长时间运行脚本之前获取唯一字符串

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);

我知道这是一个常见的问题。 长话短说:我将在长时间运行脚本期间向用户显示进度

这是我的代码/想法:将“进度”存储在mysql中,以便Ajax可以读取它(当然是通过PHP)

“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中写入的进度,因此在事务完成之前,该进度不可供其他线程读取?