我已使用console/controllers
在SuggestionController
中创建了一个控制台命令。
如果我运行像php yii suggestions
这样的命令,那就是它的工作。
我想知道如何在没有yii2
的任何扩展名的情况下从网上执行控制台命令。
答案 0 :(得分:5)
可以做得更简单
$oldApp = \Yii::$app;
new \yii\console\Application([
'id' => 'Command runner',
'basePath' => '@app',
'components' => [
'db' => $oldApp->db,
],
);
\Yii::$app->runAction('migrate/up', ['migrationPath' => '@yii/rbac/migrations/', 'interactive' => false]);
\Yii:$app = $oldApp;
<强> Github LINK 强>
答案 1 :(得分:2)
这是我前段时间发现和使用的方式来运行yii控制台控制器/操作(我用它来从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 \yii\console\controllers\SuggestionController;
$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 . "\n";
}
fclose($handle);
return $message;
答案 2 :(得分:1)
你可以UITableView
你的命令'''yp yii suggestions'''但这可能会导致网络服务器用户的权限问题。
更好的方法是使用ConsoleRunner扩展,例如yii2-console-runner 或yii2-console-runner-extension使用UITableViewCells
使作业控制工作更复杂,更安全。
执行exec()
等时始终注意代码注入!
答案 3 :(得分:1)
自Yii2 - 2.0.11.2高级应用程序 - 这可行
首先让我们确保控制器和命名空间正确。在这种情况下,前端应用程序访问控制台应用程序导入方法()
在console \ controllers \ FhirController
中在控制台\ 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 console\controllers\FhirController('fhir', Yii::$app);
$consoleController->runAction('import');
答案 4 :(得分:1)
在我正在检修的站点上,我需要一个后台任务,该任务可以通过操作进行切换,这需要我也可以使用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,谢谢。
答案 5 :(得分:0)
我认为这是最简单的解决方案:
$controller = new SuggestionController(Yii::$app->controller->id, Yii::$app);
$controller->actionSuggestions();
答案 6 :(得分:0)
yii2调用控制台命令。
我的控制器名称:
UnitController
在文件夹中
控制台/控制器
我的动作名称:
actionUnitDesc
if(!defined('STDIN')) define('STDIN', fopen('php://stdin', 'rb'));
if(!defined('STDOUT')) define('STDOUT', fopen('php://stdout', 'wb'));
if(!defined('STDERR')) define('STDERR', fopen('php://stderr', 'wb'));
$consoleController = new \console\controllers\UnitController('unit', Yii::$app);
$consoleController->runAction('unit-des');