注:以下は、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」秒に変更したところ、
本運用環境でもエラーが出なくなり、
上記で挙げた問題点が全て解決した。やれやれ。