Ping モジュール

 

Drupal 4.7.x, Drupal 5.x のping送信は、標準モジュールの ping.module によって実現されています。

ping送信先は、ping.module内にハードコーディングで「http://rpc.pingomatic.com」 が1つだけ指定されています。 従って、ping送信先を指定するには modules/ping.module を修正します。

修正のポイントは次の4点です。 pingに関連する問題についても併せて修正します。

  • 複数のping送信先を指定できるようにする。
  • サイトスローガンを設定していないサイトから ping を送信できない問題に対応する。 この問題は Drupal 5.x では解決しています。
  • サイトの URL が「http://」になってしまう問題に対応する。
  • ログは、ping送信の失敗だけでなく、成功についても記録する。 (記録の必要がなくなったら、再びソースコードを修正すれば良い。)

修正方法

modules/ping.module から修正箇所を抜粋して説明します。 修正する関数は、ping_cron 関数と ping_ping 関数の2つです。

ping_cron 関数の修正 (4.7.x)

ping_cron 関数から強調部分を削除して、 サイトスローガンを設定していないサイトからでも ping の送信を可能にします。

修正前
function ping_cron() {
  global $base_url;

  if (variable_get('site_name', 0) && variable_get('site_slogan', 0)) {
    if (db_num_rows(db_query("SELECT nid FROM {node} WHERE status = 1 AND moderate = 0 AND (created > '". variable_get('cron_last', time()) ."' OR changed > '". variable_get('cron_last', time()) ."')"), 1)) {
      _ping_notify(variable_get('site_name', '') .' - '. variable_get('site_slogan', ''), $base_url);
    }
  }
}

修正後
function ping_cron() {
  global $base_url;

  if (variable_get('site_name', 0)) {
    if (db_num_rows(db_query("SELECT nid FROM {node} WHERE status = 1 AND moderate = 0 AND (created > '". variable_get('cron_last', time()) ."' OR changed > '". variable_get('cron_last', time()) ."')"), 1)) {
      _ping_notify(variable_get('site_name', ''), $base_url);
    }
  }
}

ping_ping 関数の修正 (4.7.x, 5.x)

ping_ping 関数で、残りの3点の修正に対応します。 強調部分は各自の環境に合わせてURLを設定します。

修正前
function ping_ping($name = '', $url = '') {

  $result = xmlrpc('http://rpc.pingomatic.com', 'weblogUpdates.ping', $name, $url);

  if ($result === FALSE) {
    watchdog('directory ping', t('Failed to notify pingomatic.com (site).'), WATCHDOG_WARNING);
  }
}

修正後
function ping_ping($name = '', $url = '') {

  $hosts = array(
    'http://api.feedster.com/ping',
    'http://api.my.yahoo.co.jp/RPC2',
    'http://blog.goo.ne.jp/XMLRPC',
    'http://blogsearch.google.com/ping/RPC2',
    'http://bulkfeeds.net/rpc',
    'http://ping.ask.jp/xmlrpc.m',
    'http://ping.bloggers.jp/rpc/',
    'http://ping.feedburner.com',   /* Feed を FeedBurner 経由で配信している場合 */
    'http://ping.namaan.net/rpc/',
    'http://rpc.reader.livedoor.com/ping',
    'http://rpc.technorati.jp/rpc/ping',
    'http://rpc.weblogs.com/RPC2'
  );

  $url = 'http://diaspar.jp';  /* 5.x の場合は http://diaspar.jp/ */

  foreach ($hosts as $h) {
    $result = xmlrpc($h, 'weblogUpdates.ping', $name, $url);
    if ($result === FALSE) {
      watchdog('directory ping', t("failed to notify {$h} (site)."), WATCHDOG_WARNING);
    }
    else {
      watchdog('directory ping', t("successfully notified {$h} (site)."), WATCHDOG_NOTICE);
    }
  }
}

動作確認

pingサーバに送信されるXMLが正しく構成されているかを調べるには、 ファイル includes/xmlrpc.inc の _xmlrpc 関数に、 強調で示す行を追加します (動作確認が終了したら元の状態に戻してください)。

  $xmlrpc_request = xmlrpc_request($method, $args);
  echo $xmlrpc_request->xml;
  $result = drupal_http_request($url, array("Content-Type" => "text/xml"), 'POST', $xmlrpc_request->xml);

ping を実行するには次のようにします。

  1. ping モジュールを有効にする。
  2. 適当な記事を更新する。
  3. コマンドラインで cron.php を実行する。

ここまでの作業がうまくいっていれば、次のようなXMLが表示されるでしょう。 このXMLはpingサーバ1機分で、多少読みやすくなるように手作業で整形してあります。

<?xml version="1.0"?>
<methodCall>
    <methodName>weblogUpdates.ping</methodName>
    <params>
        <param>
            <value>
                <string>Diaspar Journal</string>
            </value>
        </param>
        <param>
            <value>
                <string>http://diaspar.jp/</string>
            </value>
        </param>
    </params>
</methodCall>

pingの送信が完了すると、Drupalのログには次のような送信結果が記録されます。 ここでは、5件分だけ抜粋して掲載しています。

タイプ 日付 メッセージ ユーザ 操作
警告 ディレクトリping 2006-07-09 03:00 failed to notify ... Anonymous
ディレクトリping 2006-07-09 03:00 successfully notified http://rpc.weblogs.com/RPC2 ... Anonymous
ディレクトリping 2006-07-09 03:00 successfully notified http://rpc.technorati.jp/rpc/ping ... Anonymous
ディレクトリping 2006-07-09 03:00 successfully notified http://ping.namaan.net/rpc/ ... Anonymous
ディレクトリping 2006-07-09 03:00 successfully notified ... Anonymous
図1 ping送信ログ

注意が必要なのは「successfully notified」となっていても、 pingが期待通りに終了しているとは限らないことです。 例えば、pingサーバに対して「http://」のような誤った URL を送信したとしても ping自体は成功してしまいます。 当然ながら、pingサーバがこのようなURLを受信したところで、クローラは出動できません。

一連の作業が終了したら、適当なブログサーチエンジンを使用して記事を検索してみます。 速い所では10分程度でヒットするでしょう。 30分経ってもどこにも収集されないのであれば、何か問題が発生している可能性を疑います。 ただし、サイトの評価が低いと収集に来てくれないので、その場合は潔く諦めます。

参考までに、次にあげるサーチエンジンは収集が速いです。 お試しください。

改版履歴

日付 内容
2007-03-16 Drupal 5.x について追加。
2006-07-09 初版