WordPress 2.0 のトラックバック送信
ようやく時間が出来たので本格的に WP 2.0 をいろいろいじって遊び始めました。
1.5 系からの機能アップの項目のひとつに「トラックバック(ピンバック)の高速化」というのがあります。 これがなかなか面白い動きをしますので、処理手順の紹介など・・・。
- 投稿時にトラックバックの指定があったら・・・
- とりあえず投稿はデータベースに保存する(そりゃそうだ)
- トラックバック先の URL を データベース to_ping 項目に保存する
- execute-pings.php に WP 本体が”アクセス”する (ソケットつなぐ)
- たたかれた execute-pings.php は to_ping を元にトラックバック処理を開始する
- WP 本体はソケットつないで GET 投げただけなので他の処理を続行できる
- で終わる
ポイントは 4 の部分で、要するに WP 本体のプロセスとは別なトラックバック送信専用のプロセスを走らせて WP 本体はトラックバック送信を待たずに終了できる = 速く感じる。 という仕掛けになっています。
いままでは、トラックバック送信が終わるまで画面が戻ってこなかったのが、送信完了前に画面が戻ってくるようになったわけです。 自分宛にトラックバックをうってみるとちょっと遅れてトラックバックがくるのが分かります。
で、トラックバック送信プロセスをキックした WP 本体が先に終了したら、トラックバック送信スレッドも一緒におちちゃうんじゃない?という疑問がでてきます。 PHP モジュールは普通ソケットの切断と同時にスレッドが落ちるからです。 で、問題の execute-pings.php を覗いてみると・・・
- register_shutdown_function('execute_all_pings');
- //execute_all_pings();
register_shutdown_function でトラックバック送信関数を登録して、逆に”プロセス終了時”にトラックバック送信が走るようになっています。 下のコメントになっている部分は、それをしていないときの名残でしょう。 なるほど、、これなら WP 本体からのソケット切断でスレッド落ちても問題なさそうです。
処理途中のソケット切断はある意味異常終了。 register_shutdown_function の登録関数が必ず呼ばれる保証があるのかないのか、PHP にうといぼくにはよく分かりませんが、これはなかなか hackish な方法です。 🙂
とりあえず、うまく動けば高速化の恩恵にはあずかれますので、ためしに10トラックバック同時送信なんて試してみると投稿終了速度の違いがよく分かると思います。 遊べる方はやってみてください。 😛