header

PHPで更新pingを送信する

(1/2)

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

0001: <?php
0002: // ここからPHPプログラム =======================================================
0003: /** SendWeblogUpdatePing.php
0004:  * 更新pingを送る
0005:  * @copyright   (c)studio pahoo
0006:  * @author      パパぱふぅ
0007:  * @version     1.0  2005/08/18
0008:  *
0009: */
0010: 
0011: /**
0012:  * 更新pingを送る
0013:  * @param   String $server  送信先サーバのURL
0014:  * @param   String $name    ブログ名/サイト名
0015:  * @param   String $url     ブログ/サイトURL
0016:  * @return  int エラーコード
0017:  *                  0  = 正常終了
0018:  *                (-1) = サーバURLが不正が見つからない
0019:  *              その他 = サーバからのエラーコード
0020: */
0021: function SendWeblogUpdatesPing($server, $name, $url) {
0022:     //送信先サーバURLをホスト名とパス名に分解する
0023:     $arr = parse_url($server);
0024:     $host = $arr["host"];       //ホスト名
0025:     $path = $arr["path"];       //パス名
0026:     if ($host == "")    return (-1);
0027: 
0028:     //送信先サーバをオープンする
0029:     $sock = fsockopen($host, 80, $errno, $errstr, 60);
0030:     if ($sock == FALSE)     return FALSE;
0031: 
0032:     //更新pingをつくる(面倒なのでテキストで処理してます)
0033:     $str = "";
0034:     $str .= "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n";
0035:     $str .= "<methodCall>\r\n";
0036:     $str .= "<methodName>weblogUpdates.ping</methodName>\r\n";
0037:     $str .= "<params>\r\n";
0038:     $str .= "<param>\r\n";
0039:     $str .= "<value>$name</value>\r\n";
0040:     $str .= "</param>\r\n";
0041:     $str .= "<param>\r\n";
0042:     $str .= "<value>$url</value>\r\n";
0043:     $str .= "</param>\r\n";
0044:     $str .= "</params>\r\n";
0045:     $str .= "</methodCall>\r\n";
0046: 
0047:     //送信する
0048:     fputs($sock, "POST " . $path . " HTTP/1.1\r\n");
0049:     fputs($sock, "Host: $host\r\n");
0050:     fputs($sock, "Content-type: text/xml\r\n");
0051:     fputs($sock, "Content-length: " . strlen($str) . "\r\n");
0052:     fputs($sock, "\r\n");
0053:     fputs($sock, "$str\r\n");
0054: 
0055:     //リターンを受け取る
0056:     $res = "";
0057:     while (!feof($sock))    $res .= fgetc($sock);
0058: 
0059:     fclose($sock);
0060: 
0061:     //リターンからエラーコードを解釈する
0062:     preg_match("/(\<\?xml)(.*)(\<\/methodResponse\>)/s", $res, $arr);
0063:     $res = preg_replace("/UTF-8/i", "utf-8", $arr[0]);  //コーディング文字の置換
0064: 
0065:     $dom = domxml_open_mem($res);
0066:     $methodres = $dom->get_elements_by_tagname("methodResponse");
0067:     $params    = $methodres[0]->get_elements_by_tagname("params");
0068:     $param     = $params[0]->get_elements_by_tagname("param");
0069:     $value     = $param[0]->get_elements_by_tagname("value");
0070:     $struct    = $value[0]->get_elements_by_tagname("struct");
0071:     $member    = $struct[0]->get_elements_by_tagname("member");
0072:     $value     = $member[0]->get_elements_by_tagname("value");
0073:     $error     = $value[0]->get_elements_by_tagname("boolean");
0074: 
0075:     return $error[0]->get_content();
0076: }
0077: 
0078: 
0079: //初回起動時
0080: if (isset($_POST["SERVER"]) == FALSE) {
0081: $myself = basename($_SERVER["PHP_SELF"]);
0082: 
0083: // ここまでPHPプログラム =======================================================
0084: ?>
0085: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
0086:  "http://www.w3.org/TR/html4/loose.dtd">
0087: <html lang="ja">
0088: <head>
0089: <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
0090: <title>更新ping送信</title>
0091: </head>
0092: <body>
0093: 
0094: <h1>■更新ping送信</h1>
0095: <form method="post" action="<?= $myself ?>">
0096: <table border="0">
0097: <tr>
0098: <td>サーバURL入力</td>
0099: <td><input name="SERVER" type="text" size="100" /></td>
0100: </tr>
0101: <tr>
0102: <td>ブログ/サイト名</td>
0103: <td><input name="NAME" type="text" size="40" /></td>
0104: </tr>
0105: <tr>
0106: <td>記事URL</td>
0107: <td><input name="URL" type="text" size="100" /></td>
0108: </tr>
0109: <tr>
0110: <td></td>
0111: <td align="center"><input type="submit" name="Submit" value="送信" /></td>
0112: </tr>
0113: </table>
0114: </form>
0115: </body>
0116: </html>
0117: 
0118: <?php
0119: // ここからPHPプログラム =======================================================
0120: } else {
0121: $name    = stripslashes($_POST["NAME"]);
0122: $url     = stripslashes($_POST["URL"]);
0123: $server  = stripslashes($_POST["SERVER"]);
0124: 
0125: $res = SendWeblogUpdatesPing($server, $name, $url);
0126: 
0127: switch ($res) {
0128:     case 0:
0129:         echo "更新pingを送信しました";
0130:         break;
0131:     case (-1):
0132:         echo "サーバURLが間違っていませんか?";
0133:         break;
0134:     default:
0135:         echo "エラーコード:$res";
0136: }
0137: }
0138: ?>
0139: 

プログラムを実行する