是否可以在控制台控制器中运行网络操作?
在Web控制器(yii \ web \ Controller)中,我有一个我想作为cron作业运行的动作。但是,如果我尝试在控制台控制器(yii \ console \ Controller)中运行它:
Yii::$app->runAction('controller/action');
然后我收到以下错误消息:
Error: Unknown command "controller/action".
答案 0 :(得分:3)
在控制台控制器中运行Web操作:
controllerNamespace
在从控制台运行Web操作之前分配enableCsrfValidation
。
此外,请为网络操作停用public function beforeAction($action)
{
if ($action->id == 'action') {
$this->enableCsrfValidation = false;
}
return parent::beforeAction($action);
}
:
'action'
np.ones((m, n))*k
ID可以替换为您当前的网络操作ID。
答案 1 :(得分:2)
抱歉,我不明白问题的背景。
正如@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可以阻止执行
答案 2 :(得分:1)
cURL解决方案。
在 web 控制器中必须禁用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);