基本流程
(以一個簡單的 Websocket 聊天室服務端為例)
1、任意位置建立項目目錄
如 SimpleChat/
進入目錄執行 composer require workerman/workerman
2、引入vendor/autoload.php (composer安裝後生成)
創建 start.php ,引入vendor/autoload.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
3、選定協議
這裡我們選定 Text 文本協議(Workerman中自定義的一個協議,格式為文本+換行)
(目前 Workerman 支持 HTTP、Websocket、Text 文本協議,如果需要使用其它協議,請參照協議一章開發自己的協議)
4、根據需要寫入口啟動腳本
例如下面這個是一個簡單的聊天室的入口文件。
SimpleChat/start.php
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$global_uid = 0;
// 當客戶端連上來時分配 uid,並保存連接,並通知所有客戶端
function handle_connection($connection)
{
global $text_worker, $global_uid;
// 為這個連接分配一個 uid
$connection->uid = ++$global_uid;
}
// 當客戶端發送消息過來時,轉發給所有人
function handle_message(TcpConnection $connection, $data)
{
global $text_worker;
foreach($text_worker->connections as $conn)
{
$conn->send("user[{$connection->uid}] said: $data");
}
}
// 當客戶端斷開時,廣播給所有客戶端
function handle_close($connection)
{
global $text_worker;
foreach($text_worker->connections as $conn)
{
$conn->send("user[{$connection->uid}] logout");
}
}
// 創建一個文本協議的 Worker 監聽 2347 接口
$text_worker = new Worker("text://0.0.0.0:2347");
// 只啟動 1 個進程,這樣方便客戶端之間傳輸數據
$text_worker->count = 1;
$text_worker->onConnect = 'handle_connection';
$text_worker->onMessage = 'handle_message';
$text_worker->onClose = 'handle_close';
Worker::runAll();
5、測試
Text 協議可以用 telnet 命令測試
telnet 127.0.0.1 2347