PHP 通過 socket_* 系列函數實現底層網絡通信,常用於對接舊系統、硬件設備、內部微服務。本文提供一個可復用的發送/接收函數,並附完整函數速查表。
<?php
/**
* Socket 發送數據並可選接收響應
* @param string $host 服務器 IP
* @param int $port 端口
* @param string $data 發送內容
* @param int $needRecv 是否等待響應 1=是 0=否
* @return mixed 成功返回響應字符串/true,失敗返回 false
*/
function sendSocketMsg($host, $port, $data, $needRecv = 0) {
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) return false;
$conn = @socket_connect($socket, $host, $port);
if ($conn === false) {
socket_close($socket);
return false;
}
socket_write($socket, $data, strlen($data));
if ($needRecv) {
$response = socket_read($socket, 1024); // 可根據協議調整長度
socket_close($socket);
return $response;
} else {
socket_close($socket);
return true;
}
}
?>
<?php
// 單向發送(如日誌上報)
sendSocketMsg('192.168.1.100', 9501, json_encode(['type'=>'log','msg'=>'test']));
// 雙向請求響應(如 RPC 調用)
$resp = sendSocketMsg('192.168.1.100', 9502, 'GET_STATUS', 1);
if ($resp !== false) {
echo "服務端返回:$resp";
} else {
echo "連接失敗或超時";
}
?>
| 函數 | 用途 |
|---|---|
| socket_create | 創建 Socket 資源 |
| socket_connect | 發起連接 |
| socket_write | 發送數據 |
| socket_read | 讀取指定長度數據 |
| socket_recv | 從緩衝區接收數據 |
| socket_close | 關閉連接 |
| socket_set_nonblock | 設置非阻塞模式 |
| socket_select | 多路復用監聽 |
| socket_get_option / socket_set_option | 獲取/設置選項 |
| socket_last_error / socket_strerror | 錯誤碼與信息 |
socket_read 遇 \n、\r、\0 視為結束,協議設計需約定分隔符socket_select 使用,避免進程掛起socket_last_error() 定位socket_close() 執行,防止 fd 洩漏Workerman、Swoole 等高性能框架stream_socket_client + stream_select掌握 Socket 基礎操作,是理解高性能網絡編程、排查通信故障的關鍵技能。