Laravel使用swoole監聽redis
開始之前,請先確保redis已經正確安裝,并正常運行。
Laravel代碼
在AppEvents目錄下新建RedisTest事件
<?php namespace AppEvents; use IlluminateBroadcastingChannel; use IlluminateQueueSerializesModels; use IlluminateBroadcastingPrivateChannel; use IlluminateBroadcastingPresenceChannel; use IlluminateFoundationEventsDispatchable; use IlluminateBroadcastingInteractsWithSockets; use IlluminateContractsBroadcastingShouldBroadcast; class RedisTest { use Dispatchable, InteractsWithSockets, SerializesModels; public $message; /** * Create a new event instance. * * @return void */ public function __construct($message) { $this->message?=?$message; ????} ????/** ????*?Get?the?channels?the?event?should?broadcast?on. ????* ????*?@return?IlluminateBroadcastingChannel|array ????*/ ????public?function?broadcastOn() ????{ ????????return?new?PrivateChannel('channel-name'); ????} }
AppListenersRedisTestListener 監聽事件代碼
<?php namespace AppListeners; use AppEventsRedisTest; use IlluminateQueueInteractsWithQueue; use IlluminateContractsQueueShouldQueue; use IlluminateSupportFacadesLog; class RedisTestListener { /** * Create the event listener. * * @return void */ public function __construct() { // } /** * Handle the event. * * @param RedisTest $event * @return void */ public function handle(RedisTest $event) { $message = $event->message; ????????Log::info('the?message?received?from?subscribed?redis?channel?msg_0:?'.$message); ????} }
AppProvidersEventServiceProvider 登記事件/監聽關系
protected?$listen?=?[ ????????'AppEventsRedisTest'?=>?[ ????????????'AppListenersRedisTestListener', ????????], ????];
監聽命令
AppConsoleCommandsRedisSubscribe 代碼如下
<?php namespace AppConsoleCommands; use IlluminateConsoleCommand; use swoole_redis; use IlluminateSupportFacadesEvent; use AppEventsRedisTest; class RedisSubscribe extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'redis:subscribe'; /** * The console command description. * * @var string */ protected $description = 'deamon process to subscribe redis broadcast'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { $client = new swoole_redis; $client->on('message',?function?(swoole_redis?$client,?$result)?{ ????????????var_dump($result); ????????????static?$more?=?false; ????????????if?(!$more?and?$result[0]?==?'message') ????????????{ ????????????????echo?"trigger?Event?RedisTestn"; ????????????????Event::fire(new?RedisTest($result[2])); ????????????} ????????}); ????????$client->connect('127.0.0.1',?6379,?function?(swoole_redis?$client,?$result)?{ ????????????echo?"connectn"; ????????????$client->subscribe('msg_0'); ????????}); ????} }
Laravel部分代碼完成
==================================
supervisor 管理進程
在 /etc/supervisor/conf.d 文件夾下新建 echo.conf , 代碼如下
[group:echos] programs=echo-queue,echo-redis [program:echo-queue] command=php?artisan?queue:work directory=/home/bella/Downloads/lnmp/echo1.0/echo user=bella autorestart=true redirect_stderr=true stdout_logfile=/home/bella/Downloads/lnmp/echo1.0/echo/storage/logs/queue.log loglevel=info [program:echo-redis] command=php?artisan?redis:subscribe directory=/home/bella/Downloads/lnmp/echo1.0/echo user=bella autorestart=true redirect_stderr=true stdout_logfile=/home/bella/Downloads/lnmp/echo1.0/echo/storage/logs/redis.log loglevel=info
完成后,執行以下命令重載
supervisorctl?reload
=================================
進入redis 客戶端,發布一個廣播通知到 msg_0 頻道
publish?msg_0?"Hello?Bella"
如果 laravel目錄下的 storagelogslaravel.log 最后的日志中記錄了廣播發送的通知,則redis監聽功能實現
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦