1、安装扩展
composer require bschmitt/laravel-amqp
2、config文件下增加amqp.php配置文件
php
<?php
return [
/*
|--------------------------------------------------------------------------
| Define which configuration should be used
|--------------------------------------------------------------------------
*/
'use' => env('AMQP_ENV', 'production'),
/*
|--------------------------------------------------------------------------
| AMQP properties separated by key
|--------------------------------------------------------------------------
*/
'properties' => [
'production' => [
'host' => env('AMQP_HOST', 'localhost'),
'port' => env('AMQP_PORT', 5672),
'username' => env('AMQP_USER', ''),
'password' => env('AMQP_PASSWORD', ''),
'vhost' => env('AMQP_VHOST', '/'),
'connect_options' => [],
'ssl_options' => [],
'exchange' => env('AMQP_EXCHANGE', 'amq.topic'),
'exchange_type' => 'direct',
'exchange_passive' => false,
'exchange_durable' => true,
'exchange_auto_delete' => false,
'exchange_internal' => false,
'exchange_nowait' => false,
'exchange_properties' => [],
'queue_force_declare' => false,
'queue_passive' => false,
'queue_durable' => true,
'queue_exclusive' => false,
'queue_auto_delete' => false,
'queue_nowait' => false,
'queue_properties' => ['x-ha-policy' => ['S', 'all']],
'consumer_tag' => '',
'consumer_no_local' => false,
'consumer_no_ack' => false,
'consumer_exclusive' => false,
'consumer_nowait' => false,
'consumer_properties' => [],
'timeout' => 0,
'persistent' => false,
'publish_timeout' => 0, // Only applicable when a publish is marked as mandatory
'qos' => false,
'qos_prefetch_size' => 0,
'qos_prefetch_count' => 1,
'qos_a_global' => false
],
],
];
3、app\Console\Commands文件下增加生产者消费者文件
生产者
php
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
use Symfony\Component\Console\Input\InputOption;
use Db;
use Bschmitt\Amqp\Facades\Amqp;
class PublishAmqpCommand extends Command
{
// 命令名
protected $name = 'zj:publishamqp';
// 描述
protected $description = "publish msg to mq";
/**
* 命令的名称及其签名
*
* @var string
*/
protected $signature = ' zj:publishamqp {msg}';
// 执行
public function handle()
{
Amqp::publish('', $this->argument('msg') , ['queue' => 'queue-name']);
}
}
消费者
php
<?php
namespace App\Console\Commands;
use App\Http\Controllers\SurveyController;
use http\Env;
use Illuminate\Console\Command;
use Illuminate\Support\Str;
use Symfony\Component\Console\Input\InputOption;
use Bschmitt\Amqp\Facades\Amqp;
class ConsumeAmqpCommand extends Command
{
// 命令名
protected $name = 'zj:consumeamqp';
// 描述
protected $description = "consume msg from mq";
// 执行
public function handle()
{
$obj = $this;
Amqp::consume('queue-name', function ($message, $resolver) use ($obj) {
if($message->body){
$data = json_decode($message->body,true);
//处理数据
}
$obj->info($message->body);
$resolver->acknowledge($message);
}, [
'routing' => 'exportdata',
'persistent' => true, // required if you want to listen forever
]);
}
}
注意:生产者和消费者的队列名称需要一致
4、bootstrap/app.php中增加
php
$app->configure('amqp');
$app->register(Bschmitt\Amqp\LumenServiceProvider::class);
5、app/Console/Kernel.php
php
<?php
namespace App\Console;
use App\Console\Commands\ConsumeAmqpCommand;
use App\Console\Commands\PublishAmqpCommand;
use Illuminate\Console\Scheduling\Schedule;
use Laravel\Lumen\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [
//
PublishAmqpCommand::class,
ConsumeAmqpCommand::class
];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(Schedule $schedule)
{
//
}
}
执行消费者命令
php
php artisan zj:consumeamqp
执行生产者命令:
php
php artisan zj:publishamqp "hello mq"
注意:1、如果使用路由ConsumeAmqpCommand 文件中 增加routing 不需要删除即可
2、多消费者:需要几个消费者增加ConsumeAmqpComman文件