注:以下は、WordPress Ver2.6.2での情報です。
トラックバックとは何ぞや?という方には下記。
昨年12月某日、このブログからリンクさせていただいた記事に、トラックバックをしてみた。しかし、トラックバック先の記事には、コメントリンクが表示されなかった。トラックバックが承認されなければ表示されないので当然と言えば当然だが、念のため、いろいろテストしてみた。その結果、
このブログの記事(以下自サイト)同士のテスト
- トラックバックを行なっても、トラックバック先にコメントリンクできない。
- ピンバック ((WordPressが持っている機能。投稿記事中からリンクしたすべてのブログへのリモートコメントを試みる。詳しくは左記URL中の「# 5.5.2 ピンバック」参照 http://wpdocs.sourceforge.jp/Introduction_to_Blogging))も行なえない。
他サイトを仮稼動しトラックバックのテスト
- 他サイト→自サイトへのトラックバックは行なえ、自サイトの記事にコメントリンクが出来た。
- 自サイト→他サイトへのトラックバックが行なえない。
一連のテストから、自サイトになんらかの問題がありそうだと気づく。ここでgoogle神社にお参りすると、WordPressでは、バージョン違いではあるが、トラックバックに関する下記のような事例があった。
- hiromasa.zone :o) » WordPress 2.0.5 Trackback Problem
- WordPress 2.0.5 でTrackback,Pingbackを送られてない件 « :: plasticdreams ::<
要は、
php.iniを書き換え、処理に利用できるメモリを増やせば解決すると思ったが、いくら値を大きくしても結果は変わらず。
仕方がないので、片っ端から動作ログを出力することにした。
動作ログ出力ファンクション:
[php]
$app_logging = 1;
function log_app($label,$msg) {
global $app_logging;
if ($app_logging) {
$fp = fopen( ABSPATH . ‘/wp-app.log’, ‘a+’);
$date = gmdate( ‘Y-m-d H:i:s’ );
fwrite($fp, “\n\n$date – $label\n$msg\n”);
fclose($fp);
}
}
[/php]
動作ログ出力(例):
[php]
log_app(‘wp_insert_post’,”wp_insert_post start.”);
[/php]
上記のような文を、投稿ボタン押下→トラックバック送信に関係しそうなところに片っ端から挿入する。
このソースをwindows上のxampp ((APACHE,MySQL,PHPの動作環境))上で動作ログコードのデバッグのため稼動させると、なんと自サイト→自サイトのトラックバックが行なえる!
訳がわからないまま、動作ログを、windowsのxampp環境上と、本運用サーバ上で採取した。
解析した結果、トラックバック・ピング ((トラックバックを通知するためのHTTPリクエスト))が送信されるまでの処理の流れは下図のように、
- 投稿ボタンの押下→投稿完了
- (おそらく)画面表示をきっかけに、登録されている処理を順次処理していく
の2つの流れがあることが分かった。
この中で、「cron.php」内の「function spawn_cron()」中の
[php]
$argyle = @fsockopen(‘ssl://’ . $parts[‘host’], $port, $errno, $errstr, 0.01);
if ($parts[‘scheme’] == ‘https’) {
// support for SSL was added in 4.3.0
if (version_compare(phpversion(), ‘4.3.0’, ‘>=’) && function_exists(‘openssl_open’)) {
$port = isset($parts[‘port’]) ? $parts[‘port’] : 443;
$argyle = @fsockopen(‘ssl://’ . $parts[‘host’], $port, $errno, $errstr, 0.01);
} else {
return false;
}
} else {
$port = isset($parts[‘port’]) ? $parts[‘port’] : 80;
$argyle = @ fsockopen( $parts[‘host’], $port, $errno, $errstr, 0.01 );
}
[/php]
@fsockopen()のタイムアップまでの秒数が0.01秒と、極端に短いことが分かった。
本運用環境では、@fsockopen()の処理結果は毎回エラーだった。マシンが非力の為@fsockopen()に毎回失敗し、後続の順次処理を呼び出すことが出来なかったのだ。
なので、上記2箇所の@fsockopen()の第5パラメータ、タイムアップまでの秒数を「0.01」→「3」秒に変更したところ、
本運用環境でもエラーが出なくなり、
上記で挙げた問題点が全て解決した。やれやれ。
コメント
本記事のcron.phpに関連した大変よい記事がありました。
・XREA & CORESERVER の cron と WordPress の wp-cron
http://another.maple4ever.net/archives/130/#comments
「wp-cron」とは、cron.phpがHTTP通信で起動するPHPスクリプトです。
上記記事から引用させていただきます。
>・・・お気づきかと思いますが、きっかけはユーザからのアクセス、ブラウザによる
>閲覧ですので、もし仮にそのサイトがその後1アクセスもなければ、いっくら
>スケジュールしておいてもなにも実行されません。
この点が自信なかったんですが、やっぱりそうだったんですね!!!
わざわざ私のブログにコメントありがとうございました。
おそらく自分で探っていたら数時間かかっていたので、大変参考になりありがとうございます。
ご教授いただいたサイト、早速拝見しました。
おそらく複合要因だと思うので、また調べてみます。
今後ともよろしくお願いします。
[…] wp-include/cron.php の wp_remote_post() の設定時間を長くする […]
WordPress:「トラックバック送信先」に送れない問題が解決した
最近、WordPressの記事作成時、「トラックバック送信先」にURLを書いても送信されず、そのまま残る問題が発生していました。 「相手側の問題なのかなー?」と気になりながらも放置して…
[…] があります。 海外の無料サーバーなんかだとレスポンスが悪いことが多いので仕方ないのかなと思ってましたが、その解決策をネットで偶然発見! WordPress:トラックバックが出来ない! […]
WordPressでトラックバックが送信できない問題の解決法
WordPressを利用していて、トラックバックが送信できず、トラックバック送信URIのテキストボックスにURIが残りっぱなし・・・ という事がよくある。 主にさくらインターネットに設置したW…
[…] http://magellanvoyage.sakura.ne.jp/20090114/444 […]