著者: Armel Fauveau
元のアドレス: http://www.phpbuilder.net/columns/armel20010427.php3
PHP はリモートまたはローカルサーバーのソケットを開くことができます。以下は、ソケットを使用した簡単な例です。Usenet ニュース サーバーに接続し、サーバーと通信し、正確なニュース グループからいくつかの記事をダウンロードします。
PHP を使用してソケットを開く
fsockopen() を使用してソケットを開きます。この関数は PHP3 と PHP4 の両方に存在します。関数のプロトタイプは次のとおりです。
intfsockopen
(string hostname,
int port [,
int errno [,
string errstr [ ,
double timeout]]])
?>
ネットワーク ホストの場合、ホスト名のポートへの TCP ソケット接続が確立されます。ホスト名にはドメイン名または IP アドレスを使用できます。 UDP 接続の場合は、プロトコル udp://hostname を指定する必要があります。 UNIX ホストの場合、ホスト名はソケットへのパスで使用され、この例ではポートを 0 に設定する必要があります。オプションのタイムアウトを使用して、接続タイムアウトの秒数を設定できます。
fsockopen() の詳細については、http://www.php.net/manual/function.fsockopen.php を参照してください。
ネットワーク ニュース転送プロトコル (NNTP)
usenet ニュースにアクセスしてくださいサーバーは、ネットワーク ニュース転送プロトコル標準である NNTP と呼ばれる特別なプロトコルを使用する必要があります。このプロトコルの詳細は RFC977 に記載されており、http://www.w3.org/Protocols/rfc977/rfc977.html で参照できます。このドキュメントでは、さまざまなコマンドを使用して NNTP サーバーに接続し、通信する方法について詳しく説明します。
サーバーへの接続
NNTP サーバーに接続するには、サーバーのホスト名 (または IP アドレス) とサーバーがリッスンするポートを知っている必要があります。接続が失敗したときにプログラムが「フリーズ」しないように、タイムアウトを追加することもお勧めします。
$cfgServer = "your.news.host";
$cfgPort = 119;
$cfgTimeOut = 10>// ソケットを開きます
if(! $cfgTimeOut)
// タイムアウトなし
$usenet_handle = fsockopen($cfgServer, $cfgPort);
else
// タイムアウトあり
$usenet_handle = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);
if(!$usenet_handle) {
echo "Connexionfailedn";
exit();
else {
echo "Connectedn";
$tmp = fgets($usenet_handle, 1024);
}
?> これでサーバーに接続できました。以前に開かれたソケット接続を通じてサーバーと対話します。サーバーに対して「特定のニュース グループから最新の 10 件の記事を取得したい」と言いましょう。 RFC977 では、正しいニュース グループを選択する方法に関するコマンドを次のように定義しています。
GROUPggg
必須パラメータ ggg は、選択するニュース グループの名前 (net.news など) です。 list コマンドを使用すると、有効なニュース リストを取得できます。選択応答が成功すると、グループ内の最初と最後の 2 つのニュース記事のニュース番号と、アーカイブされたニュース番号の推定値が返されます。
例:
chrome:~$ telnetmy.news.host 119
aa.bb.cc.dd を試行中...
tomy.news.host に接続しました
エスケープ文字。
200 my.news.hostInterNetNews NNRP サーバー INN 2.2.2 13-Dec-1999 (投稿OK)
GROUP alt.test
211 232 222996 223235alt.test
quit
205 .
コマンド「GROUP alt.test」を受信した後、ニュースサーバーは「211232 222996 223235 alt.test」を返しました。211 は RFC 識別コードです (コマンドが正常に実行されたことを示す簡単な説明です。詳細については RFC を確認してください)。返された情報は、記事が 232 件あり、その中で最も古いニュースのインデックス番号が 222996 であることを示しています。最新のニュースインデックス番号は 223235 です。ここで計算してみましょう: 222996 232 は 232235 に等しくありません。見つからない記事はサーバーから削除されたか、作成者によってキャンセルされたか (はい、それは可能で簡単です)、または削除されました。
注意してください、サーバーはニュース グループを選択する前に認証を必要とする場合があります。これはサーバーがパブリックかプライベートかによって異なります。通常、誰でもニュースを入手できますが、ニュースを発行するには認証が必要です。
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup = "alt.php";プライベートサーバー上で
if($cfgUser) {
fputs($usenet_handle, "AUTHINFO USER".$cfgUser."n");
$tmp = fgets($usenet_handle,
); fputs($usenet_handle, "AUTHINFO PASS ".$cfgPasswd."n");
$tmp = fgets($usenet_handle, 1024);
// エラーをチェック
if($tmp != "281Okrn" ") {
echo "502Authentication errorn";
exit();
}
// ニュースグループを選択
fputs($usenet_handle, "GROUP ".$cfgNewsGroup. " n ");
$tmp = fgets($usenet_handle, 1024);
if($tmp == "commandrn には 480 認証が必要です") {
echo "$tmpn";
exit( ) ;
}
$info = split(" ", $tmp);
$last = $info[3]; print "First : $firstn";
print "Last : $lastn";>
最新の記事のインデックス番号を取得しました。最新の記事10件を簡単に取得できます。 RFC977 には、ARTICLE コマンドを記事のインデックス番号またはメッセージ ID とともに使用できると記載されています。注意のため、ここでは記事のインデックス番号とメッセージ ID が異なります。各ニュース サーバーの定義が異なるため、同じ記事のインデックス番号はニュース サーバーごとに異なりますが、メッセージ ID は同じである必要があります。 (記事のヘッダーに含まれます)
$cfgLimit = 10;
// 最後の記事をアップロードします
$boucle=$last-$cfgLimit; ($ boucle <= $last) {
set_time_limit(0);
fputs($usenet_handle, "ARTICLE$bouclen");
$article=""; $usenet_handle , 4096);
if(substr($tmp,0,3) != "220") {
echo " ------------------ -------- -- n";
echo "記事 $bouclen のエラー";
echo " --------------------- -- n";
}
else {
while($tmp!=".rn") {
$tmp = fgets($usenet_handle, 4096);
$article = $記事.$tmp;
}
echo " ---------------------- n";
echo "Article$bouclen"; 🎜> echo "----- ------- n";
echo "$articlen"
} }
$boucle ;
}
?>
このサーバーでは、このグループから 10 件の最新ニュースのみを取得しました。 HEAD コマンドを使用して記事のヘッダー情報を取得したり、BODY コマンドを使用してニュースの本文を取得したりすることもできます。
接続を閉じます
fclose() 関数を使用して、NNTP サーバーとのセッションを終了します。 もちろん、次のように新しいファイルを作成することもできます:
/ / 接続を閉じる
fclose($usenet_handle);
?> fclose() の詳細については、http://www.php.net/manual/function.fclose.php を参照してください。
結論
この記事では、NNTP サーバーに接続し、ニュース グループからいくつかの記事を取得するなど、特定の状況下でソケット接続を開いて使用し、閉じる方法のみを説明しました。 POST コマンドを使用して NNTP サーバーに記事を公開することは、それほど複雑ではありません。
次のステップは、記事を簡単に保存し、検索エンジン (htgid、http://www.htdig.org/ など) を使用できるニュース クライアントを作成する (そして Netscape の一部を削除する) ことです。これらの記事にインデックスを付けて、ニュース グループの下でキーワード検索を実行できる WEB アプリケーションを持っています。以下に例を示します。http://www.phpindex.com/ng/ にアクセスしてダウンロードできます。