PHP 需與其他程式(如 Java、Go、C++ 服務)交換資料時,Socket 是基礎選擇。本文提供一個開箱即用的封裝函數,支援發送資料與可選的同步接收回應。
/**
* Socket 發送/接收資料
* @param string $host 目標伺服器 IP
* @param int $port 目標端口
* @param string $str 待發送資料
* @param int $back 是否等待回應:1=是, 0=否
* @return mixed 成功返回 true/回應資料,失敗返回 false
*/
function sendSocketMsg($host, $port, $str, $back = 0) {
$socket = socket_create(AF_INET, SOCK_STREAM, 0);
if ($socket < 0) return false;
$result = @socket_connect($socket, $host, $port);
if ($result === false) return false;
socket_write($socket, $str, strlen($str));
if ($back != 0) {
$input = socket_read($socket, 1024); // 讀取最多 1024 位元組
socket_close($socket);
return $input;
} else {
socket_close($socket);
return true;
}
}
關鍵點:socket_read 第二參數限制讀取長度,防止阻塞。預設遇到 \n、\t 或 \0 視為輸入結束。
| 函數 | 用途 |
|---|---|
| socket_create() | 建立 Socket 資源 |
| socket_connect() | 發起連線 |
| socket_write() | 寫入資料到緩衝區 |
| socket_read() | 讀取指定長度資料 |
| socket_close() | 關閉連線釋放資源 |
| socket_set_block() / socket_set_nonblock() | 設定阻塞/非阻塞模式 |
| socket_select() | 多路複用監聽 |
| socket_get_option() / socket_set_option() | 獲取/設定 Socket 選項 |
| socket_last_error() / socket_strerror() | 錯誤碼與錯誤訊息 |
其餘進階函數(socket_iovec_*、socket_recvmsg、socket_sendto 等)適用於高性能分散/聚合 I/O 場景,日常較少直接使用。
socket_read() 會持續讀取直到遇到 \n/\t/\0,若協議無明確結束符需自行處理socket_set_option 設定 SO_RCVTIMEO/SO_SNDTIMEO)