著者: アルメル・フォーヴォー
元のアドレス: http://www.phpbuilder.net/columns/armel20010427.php3
翻訳者: Xu [email protected]
http://www.phpobject.net/blog/
PHP はリモートまたはローカルサーバーのソケットを開くことができます。以下は、ソケットを使用した簡単な例です。Usenet ニュース サーバーに接続し、サーバーと通信し、正確なニュース グループからいくつかの記事をダウンロードします。
PHPを使用してソケットを開く
fsockopen() を使用してソケットを開きます。この関数は PHP3 と PHP4 の両方に存在します。関数のプロトタイプは次のとおりです。
<?php
intfsockopen
(文字列ホスト名、
int ポート[,
int エラー番号[,
文字列 errstr[,
ダブルタイムアウト]]])
?>
ネットワーク ホストの場合は、ホスト名のポートへの 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 アドレス) とサーバーがリッスンするポートを知っている必要があります。接続が失敗したときにプログラムが「フリーズ」しないように、タイムアウトを追加することもお勧めします。
<?php
$cfgServer="your.news.host";
$cfgポート =119;
$cfgTimeOut =10;
// アソケットをオープンする
if(!$cfgTimeOut)
// タイムアウトなし
$usenet_handle=fsockopen($cfgServer,$cfgPort);
それ以外
// タイムアウトあり
$usenet_handle=fsockopen($cfgServer,$cfgPort, &$errno, &$errstr,$cfgTimeOut);
if(!$usenet_handle) {
echo"接続に失敗しましたn";
出口();
}
それ以外 {
echo「接続されましたn」;
$tmp=fgets($usenet_handle,1024);
}
?>
サーバーとの対話 これでサーバーに接続され、前に開いたソケット接続を通じてサーバーと対話できるようになります。サーバーに対して「特定のニュース グループから最新の 10 件の記事を取得したい」と言いましょう。 RFC977 では、正しいニュース グループを選択する方法に関するコマンドが次のように定義されています。
グループggg
必須パラメータ ggg は、選択するニュース グループの名前です (net.news など)。 list コマンドを使用すると、有効なニュース リストを取得できます。選択応答が成功すると、グループ内の最初と最後の 2 つのニュース記事のニュース番号と、アーカイブされたニュース番号の推定値が返されます。
例えば
クロム:~$ telnetmy.news.host 119
aa.bb.cc.dd を試行しています...
tomy.news.host に接続しました。
エスケープ文字は「^]」です。
200 my.news.hostInterNetNews NNRP サーバー INN 2.2.2 13-Dec-1999 準備完了 (投稿OK)。
グループ代替テスト
211 232 222996 223235代替テスト
やめる
205.
コマンド「GROUP alt.test」を受信した後、ニュース サーバーは「211232 222996 223235 alt.test」を返しました。 211 は RFC 識別コードです (コマンドが正常に実行されたことを示す簡単な説明です。詳細については RFC を確認してください)。返された情報は、記事が 232 件あり、その中で最も古いニュースのインデックス番号が 222996 であることを示しています。最新のニュースインデックス番号は 223235 です。ここで計算してみましょう: 222996+232 は 232235 に等しくありません。見つからない記事はサーバーから削除されたか、作成者によってキャンセルされたか (はい、それは可能で簡単です)、または削除されました。
予防措置として、サーバーがパブリックかプライベートかに応じて、ニュース グループを選択する前にサーバーで認証が必要になる場合があります。通常、誰でもニュースを入手できますが、ニュースを発行するには認証が必要です。
<?php
//$cfgUser = "xxxxxx";
//$cfgPasswd = "yyyyyy";
$cfgNewsGroup="alt.php";
// プライベートサーバーでは ID が必要です
if($cfgUser) {
fputs($usenet_handle,"AUTHINFO USER".$cfgUser."n");
$tmp=fgets($usenet_handle,1024);
fputs($usenet_handle,"AUTHINFOPASS".$cfgPasswd."n");
$tmp=fgets($usenet_handle,1024);
// エラーチェック
if($tmp!="281Okrn") {
echo "502認証エラーn";
出口();
}
}
// ニュースグループを選択
fputs($usenet_handle,"GROUP ".$cfgNewsGroup."n");
$tmp=fgets($usenet_handle,1024);
if($tmp=="480 コマンドには認証が必要ですrn") {
エコー "$tmpn";
出口();
}
$info=split(" ",$tmp);
$first=$info[2];
$last=$info[3];
print"最初: $firstn";
print"最後 : $lastn";
?>
いくつかの記事を取得する 最新の記事の A インデックス番号がわかったので、最新の 10 件の記事を簡単に取得できます。 RFC977 には、ARTICLE コマンドを記事のインデックス番号またはメッセージ ID とともに使用できると記載されています。注意のため、ここでは記事のインデックス番号とメッセージ ID が異なります。ニュース サーバーごとに定義が異なるため、同じ記事でも異なるニュース サーバーではインデックス番号が異なりますが、メッセージ ID は同じである必要があります。ユニークです(記事のヘッダーに含まれています)。
<?php
$cfgリミット=10;
// 最後の記事をアップロードします
$boucle=$last-$cfgLimit;
while ($boucle<=$last) {
set_time_limit(0);
fputs($usenet_handle,"ARTICLE$bouclen");
$article="";
$tmp=fgets($usenet_handle,4096);
if(substr($tmp,0,3) !="220") {
エコー"+----------------------+n";
echo"記事 $boucle のエラーn";
エコー"+----------------------+n";
}
それ以外 {
while($tmp!=".rn") {
$tmp=fgets($usenet_handle,4096);
$article=$article.$tmp;
}
エコー"+----------------------+n";
echo"Article$bouclen";
エコー"+----------------------+n";
エコー"$articlen";
}
$ブークル++;
}
?>
このサーバーでは、このグループから 10 件の最新ニュースのみを取得します。 HEAD コマンドを使用して記事のヘッダー情報を取得したり、BODY コマンドを使用してニュースの本文を取得したりすることもできます。
接続を閉じ、 fclose() 関数を使用して NNTP サーバーとのセッションを終了します。 もちろん、次のように新しいファイルを作成することもできます。
<?php
// 密接な接続
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/にアクセスしてダウンロードできます。