如何在Yii中的web应用程序操作中调用控制台命令?

如何在Yii中的web应用程序操作中调用控制台命令?,yii,console-application,Yii,Console Application,我有一个控制台命令来执行消费时间,我需要知道如何在YII中的web应用程序操作中调用(执行)它 class MyCommand extends CConsoleCommand{ public function actionIndex(){ $model = new Product(); $model->title = 'my product'; ... $model->save();

我有一个控制台命令来执行消费时间,我需要知道如何在YII中的web应用程序操作中调用(执行)它

class MyCommand extends CConsoleCommand{
      public function actionIndex(){
          $model = new Product();
          $model->title = 'my product';
          ...
          $model->save();
          .
          .
          .
      }
}

我想执行这段代码。

Yii is PHP->您可以使用在中指定的标准PHP构造和页面底部附近的相关方法,具体取决于您想要实现的目标。

我也遇到了同样的问题-我需要从控制器内部和命令调用操作

我说同样的问题是因为它实际上是一样的——你们需要从控制台调用动作,也需要从控制器调用动作

如果您需要调用操作(命令)作为控制器操作的一部分,那么我认为您需要稍微修改此解决方案。还是我的解决方案对你来说就足够了

因此,我的解决方案如下:

首先创建如中所述的操作

然后,控制器中的操作将作为usuall加载:

class TestController extends Controller
{

    public function actions() {
        return array(
            'notifyUnsharedItems'=>'application.controllers.actions.NotifyUnsharedItemsAction',
    );
}
在命令中,我以以下方式运行操作:

class NotifyUnsharedItemsCommand extends CConsoleCommand
{
    public function run($args)
    {
        $action = Yii::createComponent('application.controllers.actions.NotifyUnsharedItemsAction',$this,'notify');
        $action->run();
    }

}
试试这个:

    Yii::import('application.commands.*');
    $command = new MyCommand("test", "test");
    $command->run(null);
必须设置值为“test”的两个参数,但它们不会产生影响,它们在使用控制台时用于--help选项

/**
 * Constructor.
 * @param string $name name of the command
 * @param CConsoleCommandRunner $runner the command runner
 */
public function __construct($name,$runner)
{
    $this->_name=$name;
    $this->_runner=$runner;
    $this->attachBehaviors($this->behaviors());
}
试试这个

Yii::import('application.commands.*');
$command = new GearmanCommand('start', Yii::app()->commandRunner);
$command->run(array('start', '--daemonize', '--initd'));

其中array('start'、'--daemonize'、'--initd')是一个动作和动作参数

此外,还有另一个来自
cebe
的非常干净的解决方案:


通常,在这些情况下,您应该做的是重构。
将“通用”代码移出MyCommand,并将其放入
components
文件夹中的类中。 现在,您可以将任何头放在“通用”代码之上,而无需更改您的功能。例如:

受保护的/components/Mywork.php:

<?php
class Mywork
{
    public function doWork()
    {
        $model = new Product();
        $model->title = 'my product';
        ...
        $model->save();
        ...
    }
}

接受我们在linux服务器上,对于Yii 1.1现实生活中的例子是:

$run = '/usr/bin/php ' . Yii::getPathOfAlias('root').'/yiic' [command]
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $run, '/dev/null', '/dev/null'));

这将在后台运行Yii console命令。

我需要知道如何执行CConsoleCommand的操作。为什么希望这是一个命令而不是控制器?这是一个示例代码。我刚才提到我需要在web操作中运行一个命令操作。但是命令的目的是运行脱机任务,因此ju可以将其用于cron作业。实际上,我需要创建一些16位随机数,并在表中插入主题,因为它花费的时间太长,我会得到最大限制时间执行错误。我需要用别的方法来做。我需要照你说的做,反之亦然。啊,我明白了。您不希望这样做,反之亦然,您希望以不超过时间限制的方式执行它。我的回答不正确,是的。为什么不将其作为cron作业运行,然后在web应用程序中使用保存的结果呢?您的答复没有被接受是不公平的,因为这是最短、最干净的方式。这是我的+1,作为一个小的替换。如果命令没有操作,只有
run
方法,该怎么办?我应该使用什么作为第一个参数。感谢您为我指明了正确的方向!虽然我跟随维基帖子,实际上是为了让它为我工作
<?php
class Mywork
{
    public function doWork()
    {
        $model = new Product();
        $model->title = 'my product';
        ...
        $model->save();
        ...
    }
}
<?php
class MyworkController
{
    public function actionDowork()
    {
        $mywork = new Mywork;
        ...
    }
}
<?php
class MyworkCommand extends CConsoleCommand
{
    public function run($args)
    {
        $mywork = new Mywork;
        ...
    }
}
$run = '/usr/bin/php ' . Yii::getPathOfAlias('root').'/yiic' [command]
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $run, '/dev/null', '/dev/null'));