PHP 內建 fsockopen() 函數,可建立 TCP/UDP Socket 連線至本地或遠端伺服器。本文以連接 Usenet NNTP 伺服器為例,示範如何透過 Socket 通訊下載指定新聞群組的文章。
int fsockopen(
string hostname,
int port,
int &errno,
string &errstr,
double timeout
)
udp:// 前綴;Unix Socket 需設 port=0)。詳細文件請見 PHP 官方手冊。
NNTP(Network News Transfer Protocol)定義於 RFC 977,規範了與新聞伺服器的指令互動流程。連線需要知道伺服器主機名/ IP 及連接埠(預設 119)。
<?php
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10;
// 建立 Socket 連線
if (!$cfgTimeOut) {
$usenet_handle = fsockopen($cfgServer, $cfgPort);
} else {
$usenet_handle = fsockopen($cfgServer, $cfgPort, $errno, $errstr, $cfgTimeOut);
}
if (!$usenet_handle) {
echo "Connection failed\n";
exit();
} else {
echo "Connected\n";
$tmp = fgets($usenet_handle, 1024); // 讀取歡迎訊息
}
?>
連線成功後,可發送 NNTP 指令。例如選擇新聞群組 GROUP alt.test,伺服器回應格式:
211 232 222996 223235 alt.test
其中包含文章總數、首末文章編號等資訊。後續可使用 HEAD、BODY、ARTICLE 等指令取得文章內容。
掌握 Socket 程式設計,即可在 PHP 中實現各種網路協議客戶端,應用範圍極廣。