2012-04-14 11 views
7

मेरे पास उपभोक्ता समय करने के लिए एक कंसोल कमांड है, और मुझे यह जानने की आवश्यकता है कि इसे YII में वेब एप्लिकेशन कार्रवाई में कैसे कॉल करें (निष्पादित करें)।वाईआई में वेब एप्लिकेशन एक्शन में कंसोल कमांड को कैसे कॉल करें?

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

मैं इस कोड को निष्पादित करना चाहता हूं।

+0

आप इसे कमांड क्यों नहीं चाहते हैं और नियंत्रक नहीं? – Puigcerber

+0

यह एक नमूना कोड है। मैंने अभी उल्लेख किया है कि मुझे वेब एक्शन में कमांड एक्शन चलाने की ज़रूरत है। – JahangirAhmad

+0

लेकिन कमांड का उद्देश्य ऑफ़लाइन कार्यों को चलाने के लिए है, इसलिए जू इसे क्रॉन नौकरी के साथ उपयोग कर सकते हैं। – Puigcerber

उत्तर

31

इस प्रयास करें:

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

असहज है कि आपका उत्तर स्वीकार नहीं किया गया क्योंकि यह सबसे छोटा और साफ संभव तरीका है। यहां मामूली प्रतिस्थापन – Blizz

+1

के रूप में मेरा +1 है यदि कमांड में क्रियाएं नहीं हैं और केवल 'रन' विधि है? मैं पहले पैरामीटर के रूप में क्या उपयोग करूं? – Gherman

+2

MyCommand में परीक्षण और परीक्षण पैरामीटर क्या है? – Kailas

0

वाईआई PHP है -> आप http://php.net/manual/en/function.exec.php पर निर्दिष्ट मानक PHP संरचनाओं और पृष्ठ के निचले भाग के संबंधित संबंधित विधियों का उपयोग कर सकते हैं, जो आप वास्तव में प्राप्त करना चाहते हैं।

+0

मुझे यह जानने की ज़रूरत है कि CConsoleCommand की कार्रवाई कैसे निष्पादित करें। – JahangirAhmad

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

} 
+0

मुझे वही करना चाहिए जो आपने कहा था। – JahangirAhmad

+0

आह, अब मैं देखता हूं। आप इसे इसके विपरीत नहीं करना चाहते हैं, आप इसे समय सीमा से अधिक नहीं होने के तरीके में निष्पादित करना चाहते हैं। मेरा जवाब गलत है, हाँ। आप इसे क्रॉन नौकरी के रूप में क्यों नहीं चलाते और सहेजे गए परिणाम का उपयोग वेब एप्लिकेशन में करते हैं? – llamerr

+0

मैं इसका परीक्षण करूंगा, धन्यवाद। – JahangirAhmad

4

प्रयास करें इस

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

जहां सरणी ('शुरू', '--daemonize', '--initd') एक कार्रवाई है और कार्रवाई पैरामीटर

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(); 
+0

मुझे सही दिशा में इंगित करने के लिए धन्यवाद! यद्यपि मैंने विकी पोस्ट का पालन किया, वास्तव में यह मेरे लिए काम कर रहा है http://www.yiiframework.com/wiki/226/run-yiic- प्रत्यक्ष रूप से-from-your-app-without-a-shell/ –

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 का परीक्षण कर सकते हैं का उपयोग करते हुए।

2

स्वीकारना कि हम लिनक्स सर्वर पर कर रहे हैं, 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 कंसोल आदेश चलेंगे।