[WordPress]Warning: fopen(wp-cron.php?doing_wp_cron)

WordPress 3.0 で投稿すると、下のような警告メッセージが表示されるのに気づく。

Warning: fopen(http://HOST/wp/wp-cron.php?doing_wp_cron) [function.fopen]: failed to open stream: HTTP request failed! in /var/www/wp/wp-includes/class-http.php on line 1045
Warning: Cannot modify header information - headers already sent by (output started at /var/www/wp/wp-includes/class-http.php:1045) in /var/www/wp/wp-includes/functions.php on line 830
Warning: Cannot modify header information - headers already sent by (output started at /var/www/wp/wp-includes/class-http.php:1045) in /var/www/wp/wp-includes/functions.php on line 831

調べてみると、オフィシャルの次のチケットに上がっていた。

Ticket #11831 Warning when wp-cron fails

まとめると、次のような内容になる。

■WP_DEBUGフラグ
warning のもとになっているのは wp-includes/class-http.php の次の箇所で、 WP_DEBUG フラグが真の場合のみ発生。

1042     if ( !WP_DEBUG )
1043       $handle = @fopen($url, 'r', false, $context);
1044     else
1045       $handle = fopen($url, 'r', false, $context);

■wp-cron.php
wp-cron.php へリクエストを送った後、レスポンスが返ってくる前にタイムアウトし、そのまま、ページのロード処理がはしり、問題の警告メッセージが表示されている。
タイムアウトは wp-includes/cron.php で 0.01 秒に設定されている。

233     $cron_url = get_option( 'siteurl' ) . '/wp-cron.php?doing_wp_cron';
234     wp_remote_post( $cron_url, array('timeout' => 0.01, 'blocking' => false,     'sslverify' => apply_filters('https_local_ssl_verify', true)) );

■類似バグ報告
類似のバグ報告がすでにある。
Ticket #8923 : cron timeout is too short

■根本原因

タイムアウトを長くすれば、警告メッセージはつぶせるが、それでは根本解決にならない。
#8923 でなぜタイムアウトが短いのか次のように説明されている。

The timeout does not matter. This is just sending the request to cause the wp-cron to execute on the server.
We don’t care what the results are, it’s just making it start running.
Marking as invalid, because raising that timeout does nothing.

タイムアウト時間を伸ばして fix とする安直な解決策はとられておらず、”defect (bug)” のまま、BTS に居座り続けている。

Leave a comment

  • Design a site like this with WordPress.com
    Get started