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

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

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

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

 Puigcerber14 апр. 2012 г., 11:40
Почему вы хотите, чтобы это была команда, а не контроллер?
 JahangirAhmad14 апр. 2012 г., 12:15
На самом деле мне нужно создать случайное число из 16 битов и вставить тему в таблицу, потому что это занимает слишком много времени, и я получаю максимальную ошибку при выполнении максимального времени и мне нужно сделать это как-нибудь еще.
 Puigcerber14 апр. 2012 г., 11:55
Но цель Команды состоит в том, чтобы запускать автономные задачи, поэтому ju может использовать ее с заданием cron.
 JahangirAhmad14 апр. 2012 г., 11:49
это пример кода. Я только что упомянул, что мне нужно запустить командное действие в веб-действии.

Ответы на вопрос(7)

что мы находимся на сервере 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 - & gt; Вы можете использовать стандартные конструкции php, указанные вhttp://php.net/manual/en/function.exec.php и связанные методы внизу страницы, в зависимости от того, чего именно вы хотите достичь.

 JahangirAhmad14 апр. 2012 г., 10:29
Мне нужно знать, как выполнить действие CConsoleCommand.

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

защищенные / компоненты / 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 как единое целое вне представления, которое вы используете.

ллера и из команды

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

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

}
 JahangirAhmad15 июл. 2012 г., 13:41
Я проверю это, спасибо.
 JahangirAhmad12 июл. 2012 г., 07:36
Мне нужно сделать то, что вы сказали, наоборот.
 12 июл. 2012 г., 23:01
ах, теперь я вижу. Вы не хотите делать это наоборот, вы хотите выполнить его так, чтобы он не превышал ограничение по времени. тогда мой ответ неверен, да. почему вы не запускаете его как задание cron и не используете сохраненный результат в веб-приложении?
Решение Вопроса

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

    Yii::import('application.commands.*');
    $command = new MyCommand("test", "test");
    $command->run(null);
 10 июл. 2015 г., 11:32
Что такое тест и тестовый параметр в MyCommand?
 13 окт. 2013 г., 12:46
Несправедливо, что ваш ответ не был принят, так как это самый короткий и чистый способ. Вот мой +1 в качестве незначительной замены
 12 сент. 2014 г., 09:12
Что делать, если команда не имеет действий и имеет толькоrun метод? Что я использую в качестве первого параметра.

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

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

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

<?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();
 01 дек. 2014 г., 16:54
Спасибо, что указал мне правильное направление! Хотя я следил за вики-постом, чтобы заставить его работать на меняyiiframework.com/wiki/226/…

Ваш ответ на вопрос