Thinkphp5.1里使用workerman的方法

workerman是一款純php開發的開源高性能的異步php socket框架。thinkphp是一個快速、兼容而且簡單的輕量級國產php開發框架,本文就來為大家介紹一下thinkphp5.1里使用workerman的方法。

Thinkphp5.1里使用workerman的方法

之前一直用swoole,最近研究workerman,于是composer安裝

composer?require?workerman/workerman

在Thinkphp控制器里面寫一段測試代碼

<?php namespace appworkermancontroller; use thinkController; use WorkermanWorker;  class Index extends Controller {      public function index()     {         // 創建一個Worker監聽2345端口,使用http協議通訊         $http_worker = new Worker("http://0.0.0.0:2345");          // 啟動4個進程對外提供服務         $http_worker->count?=?4;  ????????//?接收到瀏覽器發送的數據時回復hello?world給瀏覽器 ????????$http_worker-&gt;onMessage?=?function($connection,?$data) ????????{ ????????????//?向瀏覽器發送hello?world ????????????$connection-&gt;send('hello?world'); ????????}; ????????//?運行worker ????????Worker::runAll(); ????}  }

命令行執行:php index.php workerman/index。以為大功告成,但是卻報下面的提示:

立即學習PHP免費學習筆記(深入)”;

Thinkphp5.1里使用workerman的方法

很明顯,workerman不能直接運行文件,看官方文檔是使用

php index.php startphp index.php stopphp index.php restart

這樣的格式執行。于是修改index.php文件綁定路由

//?[?應用入口文件?] namespace?think;  //?加載基礎文件 require?__DIR__?.?'/../thinkphp/base.php';  //?支持事先使用靜態方法設置Request對象和Config對象  //?執行應用并響應 Container::get('app')-&gt;bind("workerman/index")-&gt;run()-&gt;send();

直接運行php index.php start,汗,居然提示說找不到start該模型。特么tp5把start作為路由解析了。那怎么辦,workerman的需要使用start的方式執行,tp5卻要把該參數解析成模型啊。

后查閱資料發現,Thinkphp5.1本身就整合了workerman了。可以使用thinkphp5的方式安裝workerman,那樣就可以使用thinkphp的運行方式運行了。

執行命令改成:

php?think?worker

后續發現Thinkphp5.1整合的workerman封裝的有點麻煩,不好用,而且如果你想用PHPSocketIO之類的workerman服務用整合的方式很麻煩。

workerman把第一個參數作為操作服務的命令,那我把它改成用第二個參數作為操作命令行不行?

果然就是這么做的。查找workerman插件里面的parseCommand()函數。這個鬼函數就是獲取那個操作命令的,把:

argv[1]改成argv[2],argv[2]改成argv[2]改成argv[2]改成argv[3]

????protected?static?function?parseCommand() ????{ ????????if?(static::$_OS?!==?OS_TYPE_LINUX)?{ ????????????return; ????????} ????????global?$argv; ????????//?Check?argv; ????????$start_file?=?$argv[0]; ????????$available_commands?=?array( ????????????'start', ????????????'stop', ????????????'restart', ????????????'reload', ????????????'status', ????????????'connections', ????????); ????????$usage?=?"Usage:?php?yourfile?<command>? ????????[mode]nCommands:?nstartttStart?worker?in?DEBUG?mode.nttUse?mode?-d?to?start?in?DAEMON?mode.nstopttStop?worker.nttUse?mode?-g?to?stop?gracefully.nrestartttRestart?workers.nttUse?mode?-d?to?start?in?DAEMON?mode.nttUse?mode?-g?to?stop?gracefully.nreloadttReload?codes.nttUse?mode?-g?to?reload?gracefully.nstatusttGet?worker?status.nttUse?mode?-d?to?show?live?status.nconnectionstGet?worker?connections.n"; ????????if?(!isset($argv[2])?||?!in_array($argv[2],?$available_commands))?{ ????????????if?(isset($argv[2]))?{ ????????????????static::safeEcho('Unknown?command:?'?.?$argv[2]?.?"n"); ????????????} ????????????exit($usage); ????????}  ????????//?Get?command. ????????$command??=?trim($argv[2]); ????????$command2?=?isset($argv[3])???$argv[3]?:?'';</command>

執行命令改成

php?server.php?index?start

(第一個參數用于Thinkphp解析路由,第二個參數用于workerman解析操作服務命令)

更多workerman知識請關注PHP中文網workerman框架教程欄目。

以上就是Thinkphp5.1里使用

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享