【问题标题】:How to run console command in yii2 from web如何从 web 在 yii2 中运行控制台命令
【发布时间】:2016-03-19 18:44:22
【问题描述】:

我在console/controllers 中使用SuggestionController 创建了一个控制台命令。

如果我运行像php yii suggestions 这样的命令,它的工作原理。

我想知道如何在没有任何yii2 扩展名的情况下从 Web 执行控制台命令。

【问题讨论】:

标签: php shell cron console yii2


【解决方案1】:

可以更简单地完成

$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

【讨论】:

    【解决方案2】:

    从 Yii2 开始 - 2.0.11.2 高级应用程序——这有效

    首先让我们确保控制器和命名空间正确。在这种情况下前端应用程序访问控制台应用程序导入方法()

    在控制台\控制器\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');
    

    【讨论】:

      【解决方案3】:

      在我正在大修的网站上,我需要一个后台任务,可以通过一个操作来切换它,这要求我也可以使用 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 时应格外小心,谢谢。

      【讨论】:

        【解决方案4】:

        这是我前段时间发现并使用的运行 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;
        

        【讨论】:

          【解决方案5】:

          你可以exec()你的命令'''php yii 建议''',但这可能会导致网络服务器用户的权限问题。

          更好的方法是使用 ConsoleRunner 扩展,例如yii2-console-runner yii2-console-runner-extension 使用 popen() 完成作业控制工作更复杂、更安全。

          在执行exec() 等时始终注意代码注入!

          【讨论】:

          • 现在它在根目录上运行。那么我如何在另一个文件夹中执行。
          【解决方案6】:

          我认为这是最简单的解决方案:

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

          【讨论】:

            【解决方案7】:

            yii2 从 web 或 api 调用控制台命令。

            我的控制器名称:

            单元控制器

            在文件夹中

            控制台/控制器

            我的动作名称:

            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');
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-01-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-12-17
              • 2023-03-18
              • 1970-01-01
              • 2017-12-16
              相关资源
              最近更新 更多