laravel+websocket是即時通訊開發必備利器,那么laravel中怎么接入workerman?下面本篇文章給大家介紹一下laravel快速接入websocket的方法,希望對大家有所幫助。
前言:此處,我們采用基于workerman開發的GatewayWorker作為socket的核心組件,因為,workerman是一個純粹的socket類庫,相對于GatewayWorker來說,更底層,更需要開發者有多進程的編程經驗,而我們大部分開發者使用workerman是為了做IM、或者游戲等,直接基于GatewayWorker開發,更快、更強。
一、安裝gateway-worker
composer?require?workerman/gateway-worker?-vvv
?二、創建Workerman啟動文件
通過下列命令,在AppConsoleCommands下創建命令行文件,并將下方代碼復制到文件中。【相關推薦:《workerman》】
php?artisan?make:command?WorkermanCommand
<?php namespace AppConsoleCommands; use GatewayWorkerBusinessWorker; use GatewayWorkerGateway; use GatewayWorkerRegister; use IlluminateConsoleCommand; use WorkermanWorker; class WorkermanCommand extends Command { protected $signature = 'workman {action} {--d}'; //執行該命令的方式 protected $description = 'Start a Workerman server.'; public function handle() { global $argv; $action = $this->argument('action'); ? ????????$argv[0]?=?'wk'; ????????$argv[1]?=?$action; ????????$argv[2]?=?$this->option('d')???'-d'?:?'';? ??????//?-d守護模式,不會因為關閉系統命令頁面而被殺掉進程。?沒有-d則關閉命令頁面直接退出進程 ? ????????$this->start(); ????} ? ????private?function?start() ????{ ????????$this->startGateWay(); ????????$this->startBusinessWorker(); ????????$this->startRegister(); ????????Worker::runAll(); ????} ? ????private?function?startBusinessWorker() ????{ ????????$worker??????????????????=?new?BusinessWorker(); ????????$worker->name????????????=?'BusinessWorker'; ????????$worker->count???????????=?1; ????????$worker->registerAddress?=?'127.0.0.1:1236'; ????????$worker->eventHandler????=?AppEvents::class;?//用作監聽事件的文件 ????} ? ????private?function?startGateWay() ????{ //因為小程序等一些平臺,要求使用wss進行socket,所以,這里需要配置下wss //此處的cert.pem和key.key是域名的證書文件 ???????$content?=?array( ????????????'ssl'?=>?array( ????????????????'local_cert'?=>?public_path('cert.pem'), ????????????????'local_pk'?=>?public_path('key.key'), ????????????????'verify_peer'?=>?false ????????????) ????????); ????????$gateway?=?new?Gateway("websocket://0.0.0.0:2346",?$content); ????????//如果不需要wss,則不用加入content這個參數 ????????$gateway->transport?=?'ssl';//不需要wss,也不用加入這個參數。 ????????$gateway->name?????????????????=?'Gateway'; ????????$gateway->count????????????????=?1; ????????$gateway->lanIp????????????????=?'127.0.0.1'; ????????$gateway->startPort????????????=?2300; ????????$gateway->pingInterval?????????=?30; ????????$gateway->pingNotResponseLimit?=?0; ?????????$data?=?array( ????????????'type'?=>?'heart' ????????); ????????$gateway->pingData?=?json_encode($data,?true); ????????$gateway->registerAddress??????=?'127.0.0.1:1236'; ????} ? ????private?function?startRegister() ????{ ????????new?Register('text://0.0.0.0:1236'); ????} }
三、創建監聽事件
創建一個app/Events.php文件來監聽處理Workman的各種事件
<?php namespace AppWorkerman; class Events { public static function onWorkerStart($businessWorker) { } public static function onConnect($client_id) { } public static function onWebSocketConnect($client_id, $data) { } public static function onMessage($client_id, $message) { } public static function onClose($client_id) { } }
四、啟動workerman
在命令行里面執行,支持的命令有 start | stop | restart,后續加 -d 的意思是守護模式【daemon】
php?artisan?workman?start?-d
五、踩坑關鍵點
1、在LINUX環境中使用。
2、有可能會啟動失敗,此時,請檢查php中,是否禁用了pcntl開頭的相關方法。在 php配置文件中查找到disable_functions,將所有pcntl開頭的方法全部刪除。
六、GatewayWorker手冊
更多編程相關知識,請訪問:workerman!!
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END
喜歡就支持一下吧
相關推薦