我有一个控制台命令来执行消费者时间,我需要知道如何在YII中的Web应用程序操作中调用(执行)它。
class MyCommand extends CConsoleCommand{
public function actionIndex(){
$model = new Product();
$model->title = 'my product';
...
$model->save();
.
.
.
}
}
我想执行此代码。
答案 0 :(得分:33)
试试这个:
Yii::import('application.commands.*');
$command = new MyCommand("test", "test");
$command->run(null);
必须设置值为“test”的2个参数但没有影响,使用控制台时它们用于--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());
}
https://github.com/yiisoft/yii/blob/master/framework/console/CConsoleCommand.php#L65
答案 1 :(得分:6)
试试这个
Yii::import('application.commands.*');
$command = new GearmanCommand('start', Yii::app()->commandRunner);
$command->run(array('start', '--daemonize', '--initd'));
其中array('start',' - damonmon',' - initd')是一个动作和动作参数
答案 2 :(得分:2)
我有同样的问题 - 我需要从内部控制器和命令
调用操作我说同样的问题,因为它实际上是相同的 - 你需要从控制台调用它,并从控制器调用它。
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";
}
}
然后在控制器动作中加载为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();
}
}
答案 3 :(得分:2)
接受我们在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控制台命令。
答案 4 :(得分:1)
Yii是PHP - >你可以使用http://php.net/manual/en/function.exec.php指定的标准php结构和页面底部附近的相关方法,具体取决于你想要达到的目的。
答案 5 :(得分:1)
另外,来自gist的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();
答案 6 :(得分:0)
通常,在这些情况下你应该做的是重构。
将“常用”代码移出MyCommand并将其放入位于components
文件夹中的类中。
现在,您可以将任何头放在“常用”代码之上,而无需更改功能。例如:
保护/组件/ 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作为您正在使用的视图之外的单个单元进行测试。