PHPでSocketsを使ってUsenetからファイルを取得する


作者:アルメル Fauveau  原文の住所:http://www.phpbuilder.net/columns/armel20010427.php3 PHPはリモートまたはローカルサーバのsocketsを開くことができます。ここはsocketを使う簡単な例です。Usenetのニュースサーバーに接続して、サーバーとコミュニケーションして、正確なニュースグループからいくつかの文章をダウンロードします。PHPを使ってソケットを開け、fsockopenを使ってソケットを開けます。この関数はPHP 3とPHP 4の両方に存在します。関数のプロトタイプは以下の通りです。php intfsockopen      (ストリングス hostname          要点 ポーター [,          要点 errno [,          ストリングス errstr [,          ドビー timeout)>>ネットワークホストの場合、TCPのソケットをホスト名のポートに接続する。ホスト名はドメイン名またはIPアドレスとすることができる。UDP接続については、そのプロトコルを明確に指摘する必要があります。udp://hostname。unixホストの場合、ホスト名はsocketの経路で使用され、この例ではポートは0に設定されなければならない。オプションタイムアウトの秒数を設定します。fsockopenに関する詳細はアクセスできます。http://www.php.net/manual/function.fsockopen.php ネットワークニュース転送プロトコル(NTP)がusenetニュースサーバーにアクセスするには、NNETPと呼ばれる特別なプロトコルが必要です。すなわち、ネットワークニュース転送プロトコル標準です。このプロトコルの詳細はRFC 977にあります。http://www.w3.org/Protocols/rfc977/rfc977.htmlに表示されます。この文書は、異なるコマンドを使用して接続し、NTPサーバと対話する方法を詳細に説明している。接続サーバがNTPサーバに接続するには、サーバのホスト名(またはIPアドレス)と、それが待ち受けるポートを知る必要があります。また、タイムアウトの時間を入れてください。失敗した時は、プログラムを凍結しません。php$cfg Server    = "your.news.host";cfgPort    = 119;cfgTimeOut    = 10; open asocket if(!$cfgTimeOut)    // without タイムアウト    $usenetハンドル = fsockopen($cfgServer、 $cfgPort);else    // with タイムアウト    $usenetハンドル = fsockopen($cfgServer、 $cfgPort &$errno &$errstr $cfgTimeOut)if(usenetハンドル {     echo「Connexionfailed」    exit();     else {     echo「Connected」    $tmp = fgets($usenet*)ハンドル、 1024);>サーバと対話して、今はサーバに接続しました。以前開いていたsocket接続を通じてサーバと対話することができます。サーバーに「あるニュースグループから最新の10編の記事を取得したい」と話してみましょう。RFC 977は、正確なニュースパケットを選択するためのコマンドを定義しています。次のように、GROPggに必要なパラメータggは、net.newsなどのニュースパケットの名前です。リストコマンドを使用して、有効なニュースリストのセットを取得できます。応答の選択に成功したら、グループの最初と最後の二つのニュースのニュース番号とアーカイブのニュース番号の推定に戻ります。例えばchrome:~$ telnetmy.news.host 119 Trying a.b.c.dd…Connectd tomy.news.host.Escape character is'^'.200 my.news.hostInterNews NRP server INN 2.2.2 13-Dec-139 ready (posting ok).GROUTP alt.test 211 232 22296 223235 alt.test quit 205 . コマンドを受けています。 alt.test、ニュースサーバが「211232」に戻りました。 22296 223235 alt.test」。211はRFCタグコードであり(簡単な説明ではコマンドの実行に成功しました。RFCを見て、より詳細な資料を得ることができます。)、戻り情報の説明の中に232つの文章があります。そのうち、一番古いニュースのインデックス番号は222996で、最新のニュースインデックス番号は223235です。今計算してみましょう。222996+232は232235に等しくないです。この失われた文章はこのサーバーから削除されたり、彼の作者によってキャンセルされたりします。あるいは削除されました。念のため、ニュースパケットを選択する前に、サーバは認証を必要とするかもしれません。もちろん、これはサーバが公開するかどうか、またはプライベートかによって決定されます。普通は誰でもニュースを得ることができますが、ニュースを発表するには認証が必要です。php//$cfgUser    = "xxxxxx"///cfgPasswd    = "yyyyy";cfgNews Group    = "alt.php"////// identification required オン prvate server if($cfgUser) {     fput($usenet_)ハンドル、 "AUTHINFO USER".$cfgUser."    $tmp = fgets($usenet*)ハンドル、 1024)    fput($usenet_)ハンドル、 "AUTHINFO PASS ".$cfgPasswd.");    $tmp = fgets($usenet*)ハンドル、 1024)    // ロック error    if($tmp) != "281 Ok\r") {         echo "502 Authentication error";        exit()    }     } // プロジェクト news group fput($usenet u)ハンドル、 "GROUTP ".$cfgNews Group.「」tmp = fgets($usenet*)ハンドル、 1024)if($tmp) == "480 Authentication required for command\r") {     echo "$tmp";    exit();     $info = スプリット(" ", $tmp);ファースト = $info[2];last = $info[3]print "ファースト : $ファースト";print "ラスト : $last";いくつかの文章を取得して、今は最新の文章のA索引番号があります。最新の10編の文章を簡単に入手できます。RFC 977は、ARTICLEコマンドを使用して、文章の索引番号またはメッセージのIDとともに使用できることを指摘する。注意するために、ここでは、記事の索引番号とメッセージIDは違っています。新聞サーバごとに定義が異なりますので、異なるニュースサーバで同じ文章の索引番号は違いますが、メッセージIDが良いのは唯一です。php$cfgLimit    = 10; アップロード last アーツックス$boucle=$last-$cfgLimit;while ($boucle <= $last) {     settime_limit(0)    fput($usenet_)ハンドル、 "ARTICLE$boucle");         $article="";    $tmp = fgets($usenet*)ハンドル、 4096)    if(substr($tmp、0、3) != "220") {         echo "+----------------------+";         echo "エロエロ onarticale $boucle";        echo "+----------------------+";     }     else {         while($tmp!=".\r") {             $tmp = fgets($usenet*)ハンドル、 4096)            $アーティスト = $article.$tmp;        }                 echo "+----------------------+";         echo "Artcle$boucle";        echo "+----------------------+";         echo "$アート";    }         $boucle++;?>私たちはこのサーバーのこのグループから最新のニュースを十件だけ取得しました。また、HEADコマンドを使って記事のヘッダ情報を取得したり、BODYコマンドを使ってニュースの本文を取得したりすることもできます。接続をオフにしてfclose()関数を使ってNTPサーバとのセッションを終了できます。もちろん、新しいファイルを作成してもいいです。以下の通りです。php// close connexion fclose($usenet u)ハンドルfclose()に関するもっと多い情報を見てください。http://www.php.net/manual/function.fclose.php 結論は、本論文では、決定された場合にどのようにして1つのsocket接続を開け、使用し、クローズするかを説明しただけである。前のNTPサーバに接続し、その後、ニュースパケットからいくつかの記事を取り出す。POST命令を使ってNTPサーバで文章を発表するのはそれほど難しくないです。そのため、次のステップはニュースクライアントを作成します。記事を簡単に保存し、httgidなどの検索エンジンを使用する必要があります。 http://www.htdig.org/)これらの記事を索引し、Webアプリケーションがニュースグループのキーワード検索を行うことができます。ここに一例があります。訪問してもいいです。http://www.phpindex.com/ng/ダウンロードします。