Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
Yii-Php执行异步后台请求_Php_Asynchronous_Yii_Request_Background Process - Fatal编程技术网

Yii-Php执行异步后台请求

Yii-Php执行异步后台请求,php,asynchronous,yii,request,background-process,Php,Asynchronous,Yii,Request,Background Process,嗨,我正试图在后台执行一个长时间运行的请求(操作) function actionRequest($id){ //execute very long process here in background but continue redirect Yii::app()->user->setFlash('success', "Currently processing your request you may check it from time to time."); $this-

嗨,我正试图在后台执行一个长时间运行的请求(操作)

function actionRequest($id){

//execute very long process here in background but continue redirect

Yii::app()->user->setFlash('success', "Currently processing your request you may check it from time to time.");
$this->redirect(array('index', 'id'=>$id));
}
我试图实现的是不让用户等待处理请求,因为通常需要5-10分钟,请求通常会进入超时,即使我将超时设置得更长,等待5-10分钟也不是一种好的用户体验

因此,我想立即返回页面通知用户他的/她的请求正在处理中,而他/她仍然可以在应用程序中浏览和执行其他操作,然后他/她可以返回页面并查看他的/她的请求是否已处理

我研究过Yii扩展,它可以工作,重定向会立即执行(某种程度上是一个后台请求),但是当做其他事情时,比如在站点中导航时,它不会加载,而且请求似乎仍然存在,在请求完成之前,我无法继续使用该应用程序

一个类似的扩展承诺了同样的事情,但我甚至不能让它工作,它说它“触及了一个url”,就像一个火和忘记工作,但不工作

我也曾尝试研究过消息队列服务,比如,但技术含量很高,我甚至不能在我的windows机器上安装Gearman,所以“农业”服务对我来说不起作用。后台处理的一些答案包括CRON和AJAX,但这听起来不太好,还有很多问题


使用异步后台处理还有其他解决方法吗?我真的很努力地寻找这一点,我真的不寻求先进/复杂的解决方案,如“将工作外包给多台机器”之类的。多谢各位

如果您希望能够通过Yii运行异步作业,您可能没有选择,只能尝试一些AJAX,以便异步检索作业的状态。以下是对我有用的高级指导原则。希望这能对你有所帮助


设置控制台操作 要运行后台作业,您需要使用Yii的控制台组件。在/protected/commands下,创建包含actionRequest()的web控制器副本(例如/protected/commands/BulkCommand.php)

这将允许您进入/protected文件夹并运行
yiic批量请求

请记住,如果您以前没有创建过控制台应用程序,则需要设置其配置,类似于您为web应用程序所做的配置。将/protected/config/main.php直接复制到/protected/config/console.php中应该可以完成90%的工作


自定义用于运行异步控制台作业的扩展 对我来说,有效的方法是结合使用两个扩展:和。TConsoleRunner使用popen来运行shell脚本,这在Windows和Ubuntu上对我很有用。我只是将其run()代码合并到CConsole中,如下所示:

public function popen($shell, $redirectOutput = '')
{
    $shell = $this->resolveCommandLine($shell, false, $redirectOutput);
    $ret = self::RETURN_CODE_SUCCESS;
    if (!$this->displayCommands) {
        ob_start();
    }

    if ($this->isWindows()) {
        pclose(popen('start /b '.$shell, 'r'));
    }
    else {
        pclose(popen($shell.' > /dev/null &', 'r'));
    }

    if (!$this->displayCommands) {
        ob_end_clean();
    }
    return $ret;
}

protected function isWindows()
{
    if(PHP_OS == 'WINNT' || PHP_OS == 'WIN32')
        return true;
    else 
        return false;
}
之后,我将CConsole的runCommand()更改为以下内容:

public function runCommand($command, $args, $async = false, &$outputLines = null, $executor = 'popen')
    {
        ...
        switch ($executor) {
            ...
            case 'popen':
                return $this->popen($shell);
            ...
        }
    }

运行异步作业 通过以上设置,您现在可以使用下面的代码片段来调用前面创建的
yiic批量请求

$console = new CConsole();
$console->runCommand('bulk request', array(
    '--arg1="argument"',
    '--arg2="argument"',
    '--arg3="argument"',
));
您可以将其插入原始actionRequest()中


检查状态 不幸的是,我不确定您的批量请求正在做什么工作。对我自己来说,我收集了一大堆文件并把它们放在一个文件夹里。我知道要输入多少文件,因此我可以轻松创建一个控制器操作,以验证到目前为止已创建了多少文件,并以简单的划分给出%的状态