<?phprequire_once__DIR__.'/vendor/autoload.php';usePhpAmqpLib\Connection\AMQPStreamConnection;usePhpAmqpLib\Message\AMQPMessage;$connection=newAMQPStreamConnection('localhost',5672,'guest','guest');$channel=$connection->channel();// do something ...$channel->close();$connection->close();
<?php$channel->queue_declare('hello',false,false,false,false);echo" [*] Waiting for messages. To exit press CTRL+C\n";$callback=function($msg){echo' [x] Received ',$msg->body,"\n";};$channel->basic_consume('hello','',false,true,false,false,$callback);while($channel->is_open()){$channel->wait();}
开启一个终端执行receive.php接收消息
$ php receive.php
[*] Waiting for messages. To exit press CTRL+C
[x] Received Hello World![x] Received Hello World![x] Received Hello World!
开启一个终端执行send.php发送消息
$ php send.php
[x] Sent 'Hello World!'
$ php send.php
[x] Sent 'Hello World!'
$ php send.php
[x] Sent 'Hello World!'
<?php$channel->queue_declare('task_queue',false,true,false,false);echo" [*] Waiting for messages. To exit press CTRL+C\n";$callback=function($msg){echo' [x] Received ',$msg->body,"\n";sleep(substr_count($msg->body,'.'));$msg->ack();};$channel->basic_qos(null,1,null);$channel->basic_consume('task_queue','',false,false,false,false,$callback);while($channel->is_open()){$channel->wait();}
<?php$channel->queue_declare('task_queue',false,true,false,false);$data=implode(' ',array_slice($argv,1));if(empty($data)){$data="Hello World!";}$msg=newAMQPMessage($data,array('delivery_mode'=>AMQPMessage::DELIVERY_MODE_PERSISTENT));$channel->basic_publish($msg,'','task_queue');echo' [x] Sent ',$data,"\n";
开启两个终端执行worker.php,然后再开启一个终端执行new_task.php
php new_task.php First message.
php new_task.php Second message..
php new_task.php Third message...
php new_task.php Fourth message....
php new_task.php Fifth message.....
worker1
php worker.php
[*] Waiting for messages. To exit press CTRL+C
[x] Received First message.
[x] Received Third message...
[x] Received Fifth message.....
worker2
php worker.php
[*] Waiting for messages. To exit press CTRL+C
[x] Received Second message..[x] Received Fourth message....
$channel->exchange_declare('direct_logs','direct',false,false,false);list($queue_name,,)=$channel->queue_declare("",false,false,true,false);$severities=array_slice($argv,1);if(empty($severities)){file_put_contents('php://stderr',"Usage: $argv[0] [info] [warning] [error]\n");exit(1);}foreach($severitiesas$severity){$channel->queue_bind($queue_name,'direct_logs',$severity);}echo" [*] Waiting for logs. To exit press CTRL+C\n";$callback=function($msg){echo' [x] ',$msg->delivery_info['routing_key'],':',$msg->body,"\n";};$channel->basic_consume($queue_name,'',false,true,false,false,$callback);while($channel->is_open()){$channel->wait();}
接收端,只接收指定路由的消息
php receive_logs_direct.php warning error
[*] Waiting for logs. To exit press CTRL+C
[x] warning:this is a warning
[x] error:this is an error
发送端
php emit_log_direct.php info "this is an info"
php emit_log_direct.php warning "this is a warning"
php emit_log_direct.php error "this is an error"[x] Sent info:this is an info
[x] Sent warning:this is a warning
[x] Sent error:this is an error
// 开启发布确认$channel->confirm_select();$channel->queue_declare('hello',false,true,false,false);$msg=newAMQPMessage('Hello World!',array('delivery_mode'=>AMQPMessage::DELIVERY_MODE_PERSISTENT));$channel->basic_publish($msg,'','hello');// 已确认发布时的回调方法$channel->set_ack_handler(function(AMQPMessage$message){// code when message is confirmedecho' [x] Sent ',$message->body,"\n";});// 未确认发布时的回调方法$channel->set_nack_handler(function(AMQPMessage$message){// code when message is nack-edecho' [x] Sent ',$message->body," failed\n";});// 设置超时时间$channel->wait_for_pending_acks(5);