2017-03-10 1 views
3

Ich habe eine Controller-Aktion, um die Benutzerdaten zu akzeptieren, Daten zu verarbeiten und dann das Ergebnis anzuzeigen. Da es ein langwieriger Prozess ist, versuche ich, dies einem Arbeiter zuzuordnen und zeige später die Ergebnisse.Richten Sie einen Arbeiter in Yii2-Heroku ein

Ich brauche Hilfe bei der Einrichtung der Arbeiter hier.

Mein aktuelles procfile ist

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

Und ich bin es Prüfung von

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

Befehl Senden

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

} 

Prozess Befehl

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

Aber es löst nicht den Arbeiter aus!

Ich öffnete zwei Terminals und versuchte, und ich konnte die Nachricht im Prozessbefehlsfenster echoed bekommen.

Nach der Bereitstellung, ich konnte die Arbeitskraft sehen und laufen

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

Aber Arbeiter auslöst nicht, wenn ich die send command auch vom Terminal laufen.

Bitte helfen!

Antwort

1

Dies ist der letzte Code, den ich funktionierte! Ich würde es sehr begrüßen, wenn es mehr bessere Ansätze gibt, um dies umzusetzen.

-Controller

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 

Befehl

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

Ich benutze Cloudamqp (https://elements.heroku.com/addons/cloudamqp) als mein AMQP-Dienst. Vergiss nicht, Dynos für Arbeiter zu skalieren!

Verwandte Themen