How to call a console command in web application action in Yii?

try this:

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

The 2 parameters with value "test" must be set but do not have an impact, they are used for the --help option when using the console.

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

https://github.com/yiisoft/yii/blob/master/framework/console/CConsoleCommand.php#L65


Try this

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

where array('start', '--daemonize', '--initd') is a action and action parameters


I had same problem - i need to call action from inside controller and from command

I said same problem because it actually same - you have action which you need to call from console, and call it from controller too.

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. Or is my solution is enough for you?

So here is my solution:

first create action as said in http://www.yiichina.net/doc/guide/1.1/en/basics.controller#action

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

then in controller action is loaded as usuall:

class TestController extends Controller
{

    public function actions() {
        return array(
            'notifyUnsharedItems'=>'application.controllers.actions.NotifyUnsharedItemsAction',
    );
}

and in command i run action in such way:

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

}