PHPで更新pingを送信する

(1/1)
ブログでは、トラックバックとは別に、そのブログが更新されたことを通知する更新 ping という仕組みが用意されている。今回は、更新 ping を送信する仕組みを PHP で実装してみることにする。

サンプル・プログラム

サンプル・プログラムの解説

0052: /**
0053:  * 更新pingを送る
0054:  * @param String $server  送信先サーバのURL
0055:  * @param String $name    ブログ名/サイト名
0056:  * @param String $url     ブログ/サイトURL
0057:  * @return int エラーコード
0058:  *                  0  = 正常終了
0059:  *                (-1) = サーバURLが不正が見つからない
0060:  *              その他 = サーバからのエラーコード
0061: */
0062: function SendWeblogUpdatesPing($server$name$url) {
0063:     //送信先サーバURLをホスト名とパス名に分解する
0064:     $arr = parse_url($server);
0065:     $host = $arr["host"];        //ホスト名
0066:     $path = $arr["path"];        //パス名
0067:     if ($host == "")   return (-1);
0068: 
0069:     //送信先サーバをオープンする
0070:     $sock = fsockopen($host, 80, $errno$errstr, 60);
0071:     if ($sock == FALSE)     return FALSE;
0072: 
0073:     //更新pingをつくる(面倒なのでテキストで処理してます)
0074:     $str = "";
0075:     $str .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
0076:     $str .= "<methodCall>\r\n";
0077:     $str .= "<methodName>weblogUpdates.ping</methodName>\r\n";
0078:     $str .= "<params>\r\n";
0079:     $str .= "<param>\r\n";
0080:     $str .= "<value>$name</value>\r\n";
0081:     $str .= "</param>\r\n";
0082:     $str .= "<param>\r\n";
0083:     $str .= "<value>$url</value>\r\n";
0084:     $str .= "</param>\r\n";
0085:     $str .= "</params>\r\n";
0086:     $str .= "</methodCall>\r\n";
0087: 
0088:     //送信する
0089:     fputs($sock, "POST " . $path . " HTTP/1.1\r\n");
0090:     fputs($sock, "Host: $host\r\n");
0091:     fputs($sock, "Content-type: text/xml\r\n");
0092:     fputs($sock, "Content-length: " . strlen($str) . "\r\n");
0093:     fputs($sock, "\r\n");
0094:     fputs($sock, "$str\r\n");
0095: 
0096:     //リターンを受け取る
0097:     $res = '';
0098:     while (!feof($sock)) $res .= fgetc($sock);
0099:     fclose($sock);
0100: 
0101:     //リターンからエラーコードを解釈する
0102:     preg_match("/(\<\?xml)(.*)(\<\/methodResponse\>)/s", $res$arr);
0103:     $res = preg_replace("/UTF-8/i", "utf-8", $arr[0]);    //コーディング文字の置換
0104:     $error = FALSE;
0105: 
0106: //PHP4用; DOM XML利用
0107:     if (! isphp5()) {
0108:         $dom = domxml_open_mem($res);
0109:         $methodres = $dom->get_elements_by_tagname('methodResponse');
0110:         $params    = $methodres[0]->get_elements_by_tagname('params');
0111:         $param     = $params[0]->get_elements_by_tagname('param');
0112:         $value     = $param[0]->get_elements_by_tagname('value');
0113:         $struct    = $value[0]->get_elements_by_tagname('struct');
0114:         $member    = $struct[0]->get_elements_by_tagname('member');
0115:         foreach ($member as $mem) {
0116:             $val = $mem->get_elements_by_tagname('value');
0117:             $bool = $val[0]->get_elements_by_tagname('boolean');
0118:             if ($bool != NULL) {
0119:                 $error = $bool[0]->get_content();
0120:             }
0121:         }
0122: //PHP5用; SimpleXML利用
0123:     } else {
0124:         $ResultSet = simplexml_load_string($res);
0125:         $member = $ResultSet->params->param->value->struct->member;
0126:         foreach ($member as $mem) {
0127:             if (isset($mem->value->boolean)) {
0128:                 $error = $mem->value->boolean;
0129:             }
0130:         }
0131:     }
0132: 
0133:     return $error;
0134: }

更新 pingの技術仕様は、XML-RPC.Comに述べられている。
ここでは、この仕様に基づき、単一のユーザ関数で送信からエラーコードの取得まで行うことにした。関数 SendWeblogUpdatesPing には、更新 pingを送信するサーバのURL、ブログ名またはサイト名、ブログまたはサイトのURLの順にパラメータを指定する。

更新 pingHTTP POST リクエストによって送信し、リターンは XML で受け取る。これは、前述のトラックバック処理関数 SendTrackBack と同じ流れである。

参考サイト

(この項おわり)
header