如何在yii2中从web运行控制台命令
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在yii2中从web运行控制台命令相关的知识,希望对你有一定的参考价值。
我用console/controllers
在SuggestionController
中创建了一个控制台命令。
如果我运行像php yii suggestions
这样的命令,它的工作。
我想知道如何从web执行控制台命令,没有yii2
的任何扩展。
它可以做得更简单
$oldApp = Yii::$app;
new yiiconsoleApplication([
'id' => 'Command runner',
'basePath' => '@app',
'components' => [
'db' => $oldApp->db,
],
);
Yii::$app->runAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]);
Yii:$app = $oldApp;
这是我发现并使用前一段时间运行yii控制台控制器/操作的方式(我用它来从web运行迁移)。
在您的Web控制器操作中:
// default console commands outputs to STDOUT
// so this needs to be declared for wep app
if (! defined('STDOUT')) {
define('STDOUT', fopen('/tmp/stdout', 'w'));
}
$consoleController = new yiiconsolecontrollersSuggestionController;
$consoleController->runAction('your action eg. index');
/**
* open the STDOUT output file for reading
*
* @var $message collects the resulting messages of the migrate command to be displayed in a view
*/
$handle = fopen('/tmp/stdout', 'r');
$message = '';
while (($buffer = fgets($handle, 4096)) !== false) {
$message .= $buffer . "
";
}
fclose($handle);
return $message;
你可以exec()
你的命令'''php yii suggestions'''但这可能会导致webserver用户的权限问题。
更好的方法是使用ConsoleRunner扩展,例如yii2-console-runner 或yii2-console-runner-extension用popen()
做一份更复杂,更安全的工作控制工作。
执行exec()
之类时,请始终注意代码注入!
从Yii2 - 2.0.11.2高级应用程序 - 这是有效的
首先让我们确保控制器和名称空间正确。在这种情况下,前端应用程序访问控制台应用程序导入方法()
在console controllers FhirController中
将别名设置为在console config main.php中可用[可选]
'aliases' => [
'@common' => dirname(__DIR__),
'@frontend' => dirname(dirname(__DIR__)) . '/frontend',
'@backend' => dirname(dirname(__DIR__)) . '/backend',
'@console' => dirname(dirname(__DIR__)) . '/console',
],
最后从前端视图,调用这样的调用:在这种情况下,调用控制器路由fhir然后方法import()
$consoleController = new consolecontrollersFhirController('fhir', Yii::$app);
$consoleController->runAction('import');
在我正在检修的网站上,我需要一个后台任务,可以通过动作切换,这要求我也可以使用ps找到它的pid。经过大量的谷歌搜索和几乎同样多的咒骂,我拼凑了解决方案。
# First change to (already-calculated) correct dir:
chdir($strPath);
# Now execute with nohup, directed to dev/null, and crucially with & at end, to run async:
$output = shell_exec("nohup php yii <console controller>/<action> > /dev/null &");
是的,我知道应该非常谨慎地使用shell_exec,谢谢。
我认为这是最简单的解决方案:
$controller = new SuggestionController(Yii::$app->controller->id, Yii::$app);
$controller->actionSuggestions();
以上是关于如何在yii2中从web运行控制台命令的主要内容,如果未能解决你的问题,请参考以下文章