本文提供一個功能完整的 PHP Socket 聊天室伺服器類別(patServer),採用事件驅動架構,支援多客戶端並發、廣播訊息、連線管理與除錯模式,可作為即時通訊應用的基礎框架。
socket_select() 多路複用,單進程處理多連線。onStart、onConnect、onReceiveData、onClose、onShutdown、onConnectionRefused。register_shutdown_function)。class patServer {
// 設定屬性
var $port = 10000;
var $domain = "localhost";
var $maxClients = -1;
var $readBufferSize = 128;
var $readEndCharacter = "\n";
var $maxQueue = 500;
var $debug = true;
var $debugMode = "text"; // 或 "html"
var $debugDest = "stdout";
// 內部狀態
var $clientFD = []; // 客戶端 Socket 資源
var $clientInfo = []; // 客戶端元資料
var $clients = 0;
// 核心方法
function start() { /* 主事件迴圈 */ }
function broadcastData($data, $exclude = []) { /* 廣播 */ }
function sendData($clientId, $data) { /* 單發 */ }
function closeConnection($id) { /* 關閉連線 */ }
function shutDown() { /* 關閉伺服器 */ }
// ... 事件鉤子留待子類別覆寫
}
class ChatServer extends patServer {
function onReceiveData($clientId, $data) {
// 收到訊息即廣播給其他人
$this->broadcastData("User {$clientId}: {$data}", [$clientId]);
}
function onConnect($clientId) {
$this->broadcastData(">>> User {$clientId} joined <<<");
}
function onClose($clientId) {
$this->broadcastData(">>> User {$clientId} left <<<");
}
}
$server = new ChatServer("0.0.0.0", 10000);
$server->setDebugMode("text", "server.log");
$server->start();
# 開啟多個終端機測試
telnet 127.0.0.1 10000
# 或
nc 127.0.0.1 10000
| 議題 | 建議方案 |
|---|---|
| 高併發 | 改用 Swoole、Workerman 或 ReactPHP 非同步框架 |
| 持久化 | 接入 Redis/RabbitMQ 做訊息佇列與離線存儲 |
| 安全性 | 啟用 TLS、實作認證授權、限制訊息長度與頻率 |
| 擴展性 | 採用多進程/多機房架構,配合負載均衡 |
patServer 展示了 PHP 底層 Socket 程式設計的核心模式,理解其運作原理有助於評估與選擇適合專案的即時通訊技術棧。