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