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 を実行するには次のようにします。
- ping モジュールを有効にする。
- 適当な記事を更新する。
- コマンドラインで 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件分だけ抜粋して掲載しています。
図1 ping送信ログ
注意が必要なのは「successfully notified」となっていても、
pingが期待通りに終了しているとは限らないことです。
例えば、pingサーバに対して「http://」のような誤った URL を送信したとしても
ping自体は成功してしまいます。
当然ながら、pingサーバがこのようなURLを受信したところで、クローラは出動できません。
一連の作業が終了したら、適当なブログサーチエンジンを使用して記事を検索してみます。
速い所では10分程度でヒットするでしょう。
30分経ってもどこにも収集されないのであれば、何か問題が発生している可能性を疑います。
ただし、サイトの評価が低いと収集に来てくれないので、その場合は潔く諦めます。
参考までに、次にあげるサーチエンジンは収集が速いです。 お試しください。
改版履歴
| 日付 |
内容 |
| 2007-03-16 |
Drupal 5.x について追加。
|
| 2006-07-09 |
初版
|