Как вызвать консольную команду в действии веб-приложения в Yii?

У меня есть консольная команда для выполнения времени потребителя, и мне нужно знать, как вызвать (выполнить) ее в действии веб-приложения в YII.

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

Я хочу выполнить этот код.

7 ответов


попробуйте это:

    Yii::import('application.commands.*');
    $command = new MyCommand("test", "test");
    $command->run(null);

попробуй такое

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

где array ('start',' --daemonize',' --initd') - это действие и параметры действия


у меня была такая же проблема - мне нужно вызвать действие внутри контроллера и от команды

Я сказал ту же проблему, потому что это на самом деле то же самое - у вас есть действие, которое вам нужно вызвать с консоли, и вызвать его с контроллера тоже.

If you need to call an action(command) as a part of controller action, then i think you need to modify this solution a little. Или вам достаточно моего решения?

Итак, вот мое решение:

создать действие, как сказано в http://www.yiichina.net/doc/guide/1.1/en/basics.controller#action

class NotifyUnsharedItemsAction extends CAction
{
    public function run()
    {
        echo "ok";
    }
}

тогда в контроллере действие загружается как обычно:

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();
    }

}

принимая, что мы находимся на сервере 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 в фоновом режиме.


Yii-PHP - > вы можете использовать стандартные конструкции php, указанные вhttp://php.net/manual/en/function.exec.php и связанные методы в нижней части страницы, в зависимости от того, что именно вы хотите достичь.


кроме того, еще одно очень чистое решение от cebe on суть:

<?php
// ...
$runner=new CConsoleCommandRunner();
$runner->commands=array(
    'commandName' => array(
        'class' => 'application.commands.myCommand',
    ),
);

ob_start();
$runner->run(array(
    'yiic',
    'idbrights',
));
echo nl2br(htmlentities(ob_get_clean(), null, Yii::app()->charset));

Yii::app()->end();

обычно то, что вы должны делать в этих ситуациях, является рефакторингом. Переместите" общий " код из MyCommand и поместите его в класс, расположенный в . Теперь вы можете поместить любую головку поверх "общего" кода, не изменяя свою функциональность. Например:

protected / компоненты / Mywork.на PHP:

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

защищенный / контроллер / MyworkController.на PHP:

<?php
class MyworkController
{
    public function actionDowork()
    {
        $mywork = new Mywork;
        ...
    }
}

защищенный / команды / MyworkCommand.на PHP:

<?php
class MyworkCommand extends CConsoleCommand
{
    public function run($args)
    {
        $mywork = new Mywork;
        ...
    }
}

этот подход упрощает тестирование, так как вы можете тестировать Mywork как единый блок вне используемого представления.