サンプル・プログラム
サンプル・プログラムの解説
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: }
ここでは、この仕様に基づき、単一のユーザ関数で送信からエラーコードの取得まで行うことにした。関数 SendWeblogUpdatesPing には、更新 pingを送信するサーバのURL、ブログ名またはサイト名、ブログまたはサイトのURLの順にパラメータを指定する。

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