Как вызвать консольную команду в действии веб-приложения в 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 как единый блок вне используемого представления.