workerman是一款純php開發的開源高性能的異步php socket框架。thinkphp是一個快速、兼容而且簡單的輕量級國產php開發框架,本文就來為大家介紹一下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->onMessage?=?function($connection,?$data) ????????{ ????????????//?向瀏覽器發送hello?world ????????????$connection->send('hello?world'); ????????}; ????????//?運行worker ????????Worker::runAll(); ????} }
命令行執行:php index.php workerman/index。以為大功告成,但是卻報下面的提示:
立即學習“PHP免費學習筆記(深入)”;
很明顯,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')->bind("workerman/index")->run()->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框架教程欄目。