【问题标题】:How can I call a console command in web application in Yii 2.0如何在 Yii 2.0 的 Web 应用程序中调用控制台命令
【发布时间】:2014-08-18 02:08:21
【问题描述】:

我有一个控制台命令来生成用户报告。我想从我的网络应用程序中调用它。我正在使用 Yii 2.0.0 beta 版。我尝试按照这篇文章中给出的答案How to call a console command in web application action in Yii?

由于 Yii 2.0 结构与 Yii 1.1 非常不同,如果我尝试包含 command/userReportController.php 会出错。有人可以指导我吗?

【问题讨论】:

  • 谢谢,但我已经浏览了文档并设置了控制台命令,我的问题是如何从网络(前端)调用它。

标签: yii2


【解决方案1】:

【讨论】:

  • 谢谢,这确实很有帮助。
  • 你是如何设置控制台运行器的?每当我从我的网络应用程序中调用它时,它都会挂起,并且浏览器会永远加载页面。在我重新启动 apache 之前,我无法打开任何其他页面。
  • Console Runner 使用 PHP_BINDIR,它指向 c:\php,但我使用 WAMP,所以 php bin dir 在其他地方。我设法解决了这个问题,但控制台运行程序仍然无法工作。无论我尝试运行有效的控制器操作,还是只是输入乱码,它总是返回状态 1:/
【解决方案2】:

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

$controller = new YourConsoleController(Yii::$app->controller->id, Yii::$app);
$controller->actionYourConsoleAction();

【讨论】:

  • 确实如此,但如果不定义来自yii\console\Application 的标准常量:STDIN、STDOUT 和 STDERR,它可能无法工作。您可能需要定义它们。
【解决方案3】:

使用此代码:

$application = new yii\console\Application($config);
$application->runAction('controller/action');

我使用这种方法而不是yii 控制台命令,因为我在托管 VPS 上运行 Yii,其中 cron 不支持 unix 命令,仅支持 php 脚本。

要这样运行而不是控制台,当然要先初始化yii配置:

defined('YII_DEBUG') or define('YII_DEBUG', true);
defined('YII_ENV') or define('YII_ENV', 'dev');

require(__DIR__ . '/vendor/autoload.php');
require(__DIR__ . '/vendor/yiisoft/yii2/Yii.php');
require(__DIR__ . '/common/config/bootstrap.php');
require(__DIR__ . '/console/config/bootstrap.php');

$config = yii\helpers\ArrayHelper::merge(
    require(__DIR__ . '/common/config/main.php'),
    require(__DIR__ . '/common/config/main-local.php'),
    require(__DIR__ . '/console/config/main.php'),
    require(__DIR__ . '/console/config/main-local.php')
);

【讨论】:

    【解决方案4】:

    假设您的操作称为文件/转换,并且您想在后台运行它:

    $cmd = "cd /home/site.com/public_html/yii && nohup php yii file/convert >/dev/null &";
    shell_exec( $cmd );
    

    【讨论】:

      【解决方案5】:

      yii2-console-runner-extension 继续加载。

      试试这个:

      是 yii(没有 ext,不是 yii.bat)

      确保将 php 文件夹添加到 PATH 变量(Windows)

      $op = shell_exec ( 'absolute/path/to/yii ' . 'cache/flush-all' );
      \yii\helpers\VarDumper::dump($op, 10, 1);
      

      输出:

      The following cache components were processed:
      
      * cache (yii\\caching\\FileCache)
      

      【讨论】:

        【解决方案6】:

        如果你真的想通过 Web 控制器运行控制台控制器喜欢迁移:

        public function actionMigrate()
        {
            // Keep current application
            $oldApp = \Yii::$app;
            // Load Console Application config
            $config = require \Yii::getAlias('@app'). '/config/console.php';
            new \yii\console\Application($config);
            $result = \Yii::$app->runAction('migrate', ['migrationPath' => '@app/migrations/', 'interactive' => false]);
            // Revert application
            \Yii::$app = $oldApp;
            return;
        }
        

        以上示例代码适用于yii2-app-basic 模板,您可以更改yii2-app-advanced 模板的路径。

        【讨论】:

          猜你喜欢
          • 2012-04-26
          • 2016-01-29
          • 2013-10-30
          • 1970-01-01
          • 1970-01-01
          • 2015-09-02
          • 2015-10-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多