Yii2:在控制台控制器中运行web操作

Yii2:在控制台控制器中运行web操作,yii2,Yii2,是否可以在控制台控制器中运行web操作 在web控制器(yii\web\controller)中,我有一个操作,我希望将其作为cron作业运行。但如果我尝试在控制台控制器(yii\console\controller)中运行它: 然后我收到以下错误消息: Error: Unknown command "controller/action". 对不起,我不明白问题的来龙去脉 正如@soju所说,您应该找到一种使用CURL的方法,但是有一种方法 $config = \yii\helpers\Arr

是否可以在控制台控制器中运行web操作

在web控制器(yii\web\controller)中,我有一个操作,我希望将其作为cron作业运行。但如果我尝试在控制台控制器(yii\console\controller)中运行它:

然后我收到以下错误消息:

Error: Unknown command "controller/action".

对不起,我不明白问题的来龙去脉

正如@soju所说,您应该找到一种使用CURL的方法,但是有一种方法

$config = \yii\helpers\ArrayHelper::merge(
            require(Yii::getAlias('@common').'/config/main.php'),
            require(Yii::getAlias('@common').'/config/main-local.php'),
            require(Yii::getAlias('@frontend').'/config/main.php'),
            require(Yii::getAlias('@frontend').'/config/main-local.php')
        );

$web_application = new \yii\web\Application($config);
$web_application->runAction('/site/index',['param1' => 1,'param2' => 2]);

您应该知道,控制器可以处理它们的行为,然后AccessControl可以阻止执行带有cURL的解决方案

网络中控制器必须禁用CSRF验证:

public function beforeAction() {
    if ($this->action->id == 'export') {
       Yii::$app->controller->enableCsrfValidation = false;
   }
   return true;
}
控制台中的cURL命令可以如下所示:

$ch = curl_init();

$options = array(
    CURLOPT_URL             => $url,
    CURLOPT_REFERER         => $url,
    CURLOPT_FOLLOWLOCATION  => 1,
    CURLOPT_RETURNTRANSFER  => 1,
    CURLOPT_COOKIESESSION   => true,
    CURLOPT_COOKIEJAR       => 'curl-cookie.txt',
    CURLOPT_COOKIEFILE      => '/var/www/yii/frontend/web/tmp',
    CURLOPT_CONNECTTIMEOUT  => 120,
    CURLOPT_TIMEOUT         => 120,
    CURLOPT_MAXREDIRS       => 10,
    CURLOPT_USERAGENT       => "Dark Secret Ninja/1.0",
    CURLOPT_POST            => 1,
    CURLOPT_POSTFIELDS      => "LoginForm[username]=".$username.
        "&LoginForm[password]=".$password.
        "&LoginForm[rememberMe]=1",
    CURLOPT_SSL_VERIFYPEER  => false,
);
curl_setopt_array( $ch, $options );

$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);   //get status code

if ( $httpCode != 200 ){
    echo "Return code is {$httpCode} \n"
        .curl_error($ch);
} else {
    echo htmlspecialchars($response);
}
curl_close($ch);

在控制台控制器中运行web操作:

Yii::$app->runAction('controller/action');
Yii::$app->controllerNamespace = "app\controllers";
Yii::$app->runAction('controller/action');
在从控制台运行web操作之前,分配
controllerNamespace


此外,对web操作禁用
启用CSRFValidation

public function beforeAction($action)
{    
    if ($action->id == 'action') {
        $this->enableCsrfValidation = false;
    }    

    return parent::beforeAction($action);
}
“操作”
ID可以替换为您当前的web操作ID


您可以简单地发出http请求(使用curl或其他方法)。或者将代码放在其他地方,以便在控制台和web控制器中使用。@soju在这种情况下使用cURL相对困难,因为存在LDAP凭据的身份验证。然后,您应该检查代码逻辑。有一个扩展,您错了,这个扩展是关于从web运行console命令的…我已经尝试了您的解决方案。它工作了,但是有几个问题,所以我决定使用cURL,请参阅下面的代码。在哪里添加它?在控制台控制器中还是在web控制器中?@MrFaisal在控制台控制器中添加调用web操作的代码。我想知道为什么它没有标记为正确答案。它适用于me@MrFaisal确保
返回parent::beforeAction($action)
总是从
beforeAction()返回。
@MrNick是的,我缺少这个