Как запустить консольную команду в yii2 из сети

Я создал консольную команду в console/controllers с помощью SuggestionController .

Если я запускаю команду, например, php yii suggestions , ее работа.

Я хочу знать, как выполнять консольную команду из сети без каких-либо расширений yii2 .

Это можно сделать гораздо проще

 $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

Вы можете выполнить команду exec() своей команде '' 'php yii предложения' '', но это может привести к возникновению проблем с правами пользователя веб-сервера.

Лучше всего использовать расширение ConsoleRunner, например yii2-console-runner или yii2-console-runner-extension, которые делают задание управления заданиями немного более сложным и более безопасным с помощью popen() .

Всегда будьте в курсе инъекций кода при выполнении exec() и тому подобное!

Это способ, которым я нашел и использовал некоторое время назад для запуска контроллера / действия yii console (я использовал это для запуска миграции из Интернета).

В действии вашего веб-контроллера:

 // 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; 

Я думаю, что это самое простое решение:

 $controller = new SuggestionController(Yii::$app->controller->id, Yii::$app); $controller->actionSuggestions(); 

Начиная с версии Yii2 – 2.0.11.2 – это работает

Сначала давайте проверим правильность контроллера и пространства имен. В этом случае приложение frontend, использующее метод импорта консольного приложения ()

В консоли \ контроллеры \ 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 import ()

 $consoleController = new console\controllers\FhirController('fhir', Yii::$app); $consoleController->runAction('import');