2017-03-10 1 views
3

私は、一括ユーザーデータを受け入れ、データを処理して結果を提示するコントローラアクションを持っています。退屈なプロセスなので、私は同じものを作業者に割り当てようとしており、後で結果を提示しようとしています。Yii2-Herokuにワーカーを設定する

私はここに作業員を設置する際に助けが必要です。

私の現在のprocfileは

web: vendor/bin/heroku-php-apache2 
worker: php yii hello/process 

であると私は

public function actionTest(){ 
    $config = require(__DIR__ . '/../config/console.php'); 
    $console = new \yii\console\Application($config); 
    $console->runAction("hello/send"); 
} 

sendコマンド

public function actionSend($message = 'hello world') 
{ 
    $conn = $this->connection; 
    $ch = $conn->channel(); 

    $exchange = 'amq.direct'; 
    $queue = 'basic_get_queue'; 
    $ch->queue_declare($queue, false, true, false, false); 
    //$ch->exchange_declare($exchange, 'direct', true, true, false); 
    //$ch->queue_bind($queue, $exchange); 

    $msg_body = $message; 
    $msg = new AMQPMessage($msg_body, array('content_type' => 'text/plain', 'delivery_mode' => 2)); 
    $ch->basic_publish($msg,'', $queue); 

    /*  
    $retrived_msg = $ch->basic_get($queue); 
    var_dump($retrived_msg->body); 
    $ch->basic_ack($retrived_msg->delivery_info['delivery_tag']); */ 

    $ch->close(); 
    $conn->close(); 

} 

Processコマンド

public function actionProcess(){ 
    $conn = $this->connection; 
    $ch = $conn->channel(); 
    $queue = 'basic_get_queue'; 
    $ch->queue_declare($queue, false, true, false, false); 

    //$retrived_msg = $ch->basic_get($queue); 
    $callback = function($msg) { 
     $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);   
     echo $msg->body; 
    }; 
    $ch->basic_qos(null, 1, null); 
    $ch->basic_consume($queue, '', false, false, false, false, $callback); 
    // loop over incoming messages 
    while(count($ch->callbacks)) { 
     $ch->wait(); 
    } 

    $ch->close(); 
    $conn->close(); 
} 
を実行することによってそれをテストしています

しかし、それは労働者を誘発していません!

2つの端末を開いて試してみましたが、プロセスコマンドウィンドウにメッセージが表示されることがありました。展開時に

、私は労働者の稼働を見ることができました

2017-03-13T10:25:24.114552+00:00 heroku[worker.1]: Starting process with command 'php yii hello/process'

2017-03-13T10:25:24.783227+00:00 heroku[worker.1]: State changed from starting to up

しかし、私はしても、端末からsend commandを実行したときに、作業者がトリガされていません。

助けてください!

答えて

1

これは私が働いている最終的なコードです!これを実現するためのより良いアプローチが存在すれば、私は本当に感謝しています。私が使用

コントローラ

public function actionTest($message){ 

    $url = parse_url(getenv('CLOUDAMQP_URL')); 
    $conn = new AMQPConnection($url['host'], 5672, $url['user'], $url['pass'], substr($url['path'], 1)); 
    $ch = $conn->channel(); 

    $exchange = 'amq.direct'; 
    $queue = 'basic_get_queue'; 
    $ch->queue_declare($queue, false, true, false, false); 

    $msg_body = $message; 
    $msg = new AMQPMessage($msg_body, array('content_type' => 'text/plain', 'delivery_mode' => 2)); 
    $ch->basic_publish($msg,'', $queue); 

    $ch->close(); 
    $conn->close(); 
} 

Procfile

web: vendor/bin/heroku-php-apache2 
worker: php yii hello/process 

コマンド

public function actionProcess(){ 
    $url = parse_url(getenv('CLOUDAMQP_URL')); 
    $conn = new AMQPConnection($url['host'], 5672, $url['user'], $url['pass'], substr($url['path'], 1)); 
    $ch = $conn->channel(); 
    $queue = 'basic_get_queue'; 
    $ch->queue_declare($queue, false, true, false, false); 

    $callback = function($msg) { 
     //save it for now 
     $mesg = new Messages(); 
     $mesg->message = $msg->body; 
     $mesg->save(false); 
     $msg->delivery_info['channel']->basic_ack($msg->delivery_info['delivery_tag']);   

    }; 
    $ch->basic_qos(null, 1, null); 
    $ch->basic_consume($queue, '', false, false, false, false, $callback); 
    // loop over incoming messages 
    while(count($ch->callbacks)) { 
     $ch->wait(); 
    } 
    $ch->close(); 
    $conn->close(); 
} 

cloudmqphttps://elements.heroku.com/addons/cloudamqp)を私のAMQPサービスとして使用します。労働者のためにダイノスをスケールすることを忘れないでください!

関連する問題