在 Yii2-Heroku 中设置一个 worker
Set up a worker in Yii2-Heroku
我有一个控制器操作用于接受批量用户数据、处理数据然后显示结果。由于这是一个繁琐的过程,我正在尝试将其分配给工作人员,然后再展示结果。
我需要帮助来设置这里的工作器。
我当前的 procfile 是
web: vendor/bin/heroku-php-apache2
worker: php yii hello/process
我正在 运行ning
测试它
public function actionTest(){
$config = require(__DIR__ . '/../config/console.php');
$console = new \yii\console\Application($config);
$console->runAction("hello/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();
}
处理命令
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();
}
但它没有触发工人!
我打开了两个终端并尝试了,我可以在进程命令中得到回显的消息 window。
部署后,我可以看到工作人员 运行正在
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
甚至来自终端时,worker 没有触发。
请帮忙!
这是我开始工作的最终代码!如果有更多更好的方法来实现这一点,我将不胜感激。
控制器
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();
}
我使用 cloudamqp(https://elements.heroku.com/addons/cloudamqp) 作为我的 AMQP 服务。不要忘记为工人缩放测功机!
我有一个控制器操作用于接受批量用户数据、处理数据然后显示结果。由于这是一个繁琐的过程,我正在尝试将其分配给工作人员,然后再展示结果。
我需要帮助来设置这里的工作器。
我当前的 procfile 是
web: vendor/bin/heroku-php-apache2
worker: php yii hello/process
我正在 运行ning
测试它public function actionTest(){
$config = require(__DIR__ . '/../config/console.php');
$console = new \yii\console\Application($config);
$console->runAction("hello/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();
}
处理命令
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();
}
但它没有触发工人!
我打开了两个终端并尝试了,我可以在进程命令中得到回显的消息 window。
部署后,我可以看到工作人员 运行正在
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
甚至来自终端时,worker 没有触发。
请帮忙!
这是我开始工作的最终代码!如果有更多更好的方法来实现这一点,我将不胜感激。
控制器
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();
}
我使用 cloudamqp(https://elements.heroku.com/addons/cloudamqp) 作为我的 AMQP 服务。不要忘记为工人缩放测功机!