fsockopen() 建立 Socket 連線
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10;
$usenet_handle = fsockopen($cfgServer, $cfgPort, $errno, $errstr, $cfgTimeOut);
if (!$usenet_handle) { echo "Connection failed\n"; exit(); }
$tmp = fgets($usenet_handle, 1024); // 讀取歡迎訊息
NNTP 協定互動流程
- 認證(私有伺服器需求):
fputs($handle, "AUTHINFO USER $user\n");
fputs($handle, "AUTHINFO PASS $pass\n");
- 選擇新聞群組:
fputs($handle, "GROUP alt.php\n");
$tmp = fgets($handle, 1024); // 211 232 222996 223235 alt.php
// 211=成功碼, 232=文章數, 222996=最舊編號, 223235=最新編號
- 擷取最新 N 篇文章:
$last = 223235; $limit = 10;
for ($i = $last - $limit + 1; $i <= $last; $i++) {
fputs($handle, "ARTICLE $i\n");
$header = fgets($handle, 4096);
if (substr($header,0,3) != '220') continue; // 文章不存在
$article = '';
while (($line = fgets($handle, 4096)) != ".\r\n") $article .= $line;
echo $article;
}
- 關閉連線:
fclose($usenet_handle);
關鍵函數說明
| 函數 | 用途 |
| fsockopen() | 開啟 TCP/UDP/Unix Socket 連線 |
| fputs()/fwrite() | 發送指令(需以 \r\n 結尾) |
| fgets() | 讀取一行回應(含換行符) |
| fclose() | 關閉連線釋放資源 |
延伸應用
- 使用
HEAD 僅取標頭、BODY 僅取內文。
- 結合
ht://Dig 建立全文搜尋引擎。
- 開發 Web 介面新聞閱讀器,支援關鍵字搜尋、分類瀏覽。