7

コンシューマー時間を実行するためのコンソール コマンドがあり、YII の Web アプリケーション アクションでそれを呼び出す (実行する) 方法を知る必要があります。

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

このコードを実行したい。

4

7 に答える 7

6

これを試して

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

ここで、array('start', '--daemonize', '--initd') はアクションおよびアクション パラメータです

于 2013-12-13T15:13:39.583 に答える
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";
    }
}

次に、通常どおりコントローラー アクションが読み込まれます。

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

}
于 2012-04-28T15:02:16.573 に答える
2

Yii 1.1 の実際の例では、Linux サーバー上にいることを受け入れると、次のようになります。

$run = '/usr/bin/php ' . Yii::getPathOfAlias('root').'/yiic' [command]
exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $run, '/dev/null', '/dev/null'));

これにより、バックグラウンドで Yii コンソール コマンドが実行されます。

于 2015-11-07T11:30:12.297 に答える
1

また、要旨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();
于 2014-06-18T08:19:46.887 に答える
1

Yii は PHP ->達成したい内容に応じて、http://php.net/manual/en/function.exec.phpで指定されている標準の php 構成要素と、ページの下部にある関連メソッドを使用できます。.

于 2012-04-14T07:42:25.527 に答える
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 を単一のユニットとしてテストできるため、テストも容易になります。

于 2014-11-25T20:35:56.080 に答える