介紹
Workerman是一款純PHP開發的開源高效能的PHP socket 服務框架。
Workerman不是重複造輪子,它不是一個MVC框架,而是一個更底層更通用的socket服務框架,你可以用它開發tcp代理、梯子代理、做遊戲伺服器、郵件伺服器、ftp伺服器、甚至開發一個php版本的redis、php版本的資料庫、php版本的nginx、php版本的php-fpm等等。Workerman可以說是PHP領域的一次創新,讓開發者徹底擺脫了PHP只能做WEB的束縛。
實際上Workerman類似一個PHP版本的nginx,核心也是多程式+Epoll+非阻塞IO。Workerman每個程式能維持上萬併發連線。由於本身常住記憶體,不依賴Apache、nginx、php-fpm這些容器,擁有超高的效能。同時支援TCP、UDP、UNIXSOCKET,支援長連線,支援Websocket、HTTP、WSS、HTTPS等通訊協議以及各種自定義協議。擁有定時器、非同步socket客戶端、非同步Mysql、非同步Redis、非同步Http、非同步訊息佇列等眾多高效能元件
在tp5.0 框架中使用
# 檢查環境是否ok
curl -Ss http://www.workerman.net/check.php | php
# 依賴 worker
composer require topthink/think-worker=1.0.*
# workerman
composer require workerman/workerman=3.3.0
建立server.php 檔案
<?php
#在 public 服務下面
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin/Worker'); // 模組/控制器
// 載入框架引導檔案
require __DIR__ . '/../thinkphp/start.php';
建立 Worker 檔案
### 在application/admin/controller 目錄建立 Worker 檔案
<?php
namespace app\admin\controller;
use think\worker\Server;
use \Workerman\Connection\AsyncTcpConnection;
class Worker extends Server
{
protected $socket = "";//本地域名
protected $modle = null;
public function __construct(){
$this->processes = 16;
$this->socket = 'websocket://127.0.0.1:1234';
parent::__construct(); // 啟動 websocker 服務
}
/**
* 收到資訊
* @param $connection
* @param $data
*/
public function onMessage($ws_connection, $data)
{
// 與遠端task服務建立非同步連線,ip為遠端task服務的ip,如果是本機就是127.0.0.1,如果是叢集就是lvs的ip
$task_connection = new AsyncTcpConnection('Text://127.0.0.1:1235');
// 傳送資料 到非同步服務處理
$task_connection->send($data);
// 非同步獲得結果
$task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)
{
// 結果 $task_result
// 獲得結果後記得關閉非同步連線
$task_connection->close();
// 通知對應的websocket客戶端任務完成
$ws_connection->send($task_result);
};
// 執行非同步連線
$task_connection->connect();
}
/**
* 當連線建立時觸發的回撥函式
* @param $connection
*/
public function onConnect($connection)
{
}
/**
* 當連線斷開時觸發的回撥函式
* @param $connection
*/
public function onClose($connection)
{
echo "close";
}
/**
* 當客戶端的連線上發生錯誤時觸發
* @param $connection
* @param $code
* @param $msg
*/
public function onError($connection, $code, $msg)
{
echo "error $code $msg\n";
}
/**
* 每個程式啟動
* @param $worker
*/
public function onWorkerStart($worker)
{
}
}
非同步處理 建立 Asyncworker.php 檔案
<?php
namespace app\admin\controller;
use think\worker\Server;
use \Workerman\Connection\AsyncTcpConnection;
class Asyncworker extends Server
{
protected $socket = "";//本地域名
protected $modle = null;
protected $monitorviewController = null;
public function __construct(){
$this->processes = 16;
$this->socket = 'Text://127.0.0.1235';//本地域名
parent::__construct();
}
/**
* 收到資訊
* @param $connection
* @param $data
*/ public function onMessage($connection, $route)
{
// 處理非同步業務邏輯
// 返回結果到 Worker 程式
$connection->send("task ok");
}
/**
* 當連線建立時觸發的回撥函式
* @param $connection
*/ public function onConnect($connection)
{
}
/**
* 當連線斷開時觸發的回撥函式
* @param $connection
*/ public function onClose($connection)
{// echo "close";
unset($connection);
}
/**
* 當客戶端的連線上發生錯誤時觸發
* @param $connection
* @param $code
* @param $msg
*/ public function onError($connection, $code, $msg)
{ echo "error $code $msg\n";
}
/**
* 每個程式啟動
* @param $worker
*/ public function onWorkerStart($worker)
{
}}
非同步服務檔案 serverAsync.php
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin/Asyncworker');
// 載入框架引導檔案
require __DIR__ . '/../thinkphp/start.php';
啟動服務
// 進入public 目錄
php serverAsync.php start -d
php server.php start -d
// 檢視 狀態
php server.php status
本作品採用《CC 協議》,轉載必須註明作者和本文連結