« [wordpress] 再びタイムスタンプチェック | ホーム | [Flash] 久々にパブリシュしたが・・・ »

2007年11月14日

[wordpress] タイムスタンプ 予約投稿・未来投稿の注意点 [自宅サーバー]

これは公開しなければ!

と思い、頑張って書こうかと思います。

zontheworldさんの記事をまずお読み下さい。

その中に

未来投稿が繁栄されない原因はソケット接続オープン時のタイムアウトでした。

  /wp-includes/cron.php の 87行目(Ver 2.1.3)の fsockopen タイムアウトが 0.01 に設定されていて、$errstr に Connection timed out を返していました。タイムアウト時間を長めにとれば大丈夫かと思います。

とあります。

$argyle = @ fsockopen( $parts['host'], $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01 );

で、まず俺がハテナになったのが、fsockopenってなんぞや?

っていうこと。

引用先はこちら

fsockopen

  (PHP 3, PHP 4, PHP 5)fsockopen -- インターネットもしくはUNIXドメインのソケット接続をオープンする

うん。ソケット接続するのね。

で、

説明

  resource fsockopen ( string target [, int port [, int &errno [, string &errstr [, float timeout]]]] )

ふむふむ。

で、実際に以下のプログラムを走らせて見た。

例 1. fsockopen()の例

< ?php

  $fp = fsockopen("自分の自宅サーバーのURL", 80, $errno, $errstr, 30);

  if (!$fp) {
      echo "$errstr ($errno)<br />\n";
  } else {
      $out = "GET / HTTP/1.1\r\n";
      $out .= "Host: 自分の自宅サーバーのURL\r\n";
      $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
      while (!feof($fp)) {
          echo fgets($fp, 128);
      }
      fclose($fp);
  }

  ?>  

これをやったら、面白い結果になった。

Connection refused (111)

とエラーメッセージが表示されたのです。

で、このエラーは何を意味するのか?と調べたところ、

引用先はこちら

エラー 111 は "Connection refused" です。接続しようとしているサーバマシンには到達しますが、指定したサーバがありません。ホスト名とディスプレイ番号を正しく使っているか確認してください。 Xlib: connection to ":0.0″ refused by server

  Xlib: Client is not authorized to connect to Server
  xterm Xt error: Can't open display: love.dial.xs4all.nl:0.0

クライアントはサーバに接続を作れましたが、サーバは (認証されていない) クライアントがディスプレイを使うことを許しません。正しいマジッククッキーをクライアントに転送し、その期限が切れていないか (新しいセッションを開始する時、サーバは新しいクッキーを使います) 確認してください。

という内容でした。

つまり、自分の自宅サーバーのURLがオープンされないという事実が判明しました。

これはマズイ。ということになり、いろいろと試してみました。
#いろいろって言っても2通りだけですけど。。。

URLを
  1)Yahoo!にしてみる。
  2)IPアドレスにしてみる。

#ここで言っているURLというのは、fsockopen("自分の自宅サーバーのURL", 80, $errno, $errstr, 30);の自分の自宅サーバーのURLのことです。

1)Yahoo!の場合、ちゃんとオープンしました。問題なし。
2)IPアドレスの場合、自宅サーバーということで、公開しているIPアドレスを入力。

しかし、自分のプロバイダは固定IPアドレスではないので、どうする?という問題になったが、実際に公開しているローカルのIPアドレス、つまり、192.168.***.***のIPアドレスを入れる。

そしたら、ちゃんとオープンされました。

つまり、自分の場合は、mydns.jpを使用しているのですが、自分自身をmydns.jpの名前を持っていることを教えていないので
自分自身なのに、気が付いていなかったのです。

まぁ自分自身のことだよ。とhostsとかに書いてあげれば別の話になりますが、(hostsに書いてもダメかも?!)

レジストラーに行って、アドレス先のIPにたどり着いた先がどこになるのか?という問題です。

よって、IPアドレスをローカルアドレスに指定して下さい。ということです。

で、wordpressの/wp-includes/cron.php の 95行目(Ver 2.2.3)の fsockopen のところに

$argyle = @ fsockopen( "192.168.***.***", $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01 );

を書きましょう。

もちろん、ローカルIPアドレスが変更した場合は、ちゃんと変更してあげてください。

それで、実際に、未来投稿・予約投稿を試したところ、問題なくちゃんと時間通りに投稿されました。

--

どうなんでしょう?

自宅サーバーで立ち上げているかたも多いのではないでしょうか?
自分みたいにつまずいている方もいるかと思い、ここが参考になったら幸いでございます。

P.S
$argyle = @ fsockopen( "192.168.***.***", $_SERVER['SERVER_PORT'], $errno, $errstr, 0.01 );
の0.01っていうのは、タイムアウト時間。長くすれば長くするほど待ってくれます。

"「応答してくださいっ!」って言って待ってる状態。その待ってる状態をどれぐらい待つか?それが、タイムアウト時間"
って認識しています。

まぁ例にもあるけれど、0.01もあれば、30もあります。どの値が適切なのかは、ちょっと自分で調べてみて下さい。m(_ _)m

ローカルIPアドレスにすれば、タイムアウト時間を"0.01"に設定しても問題なく動きました。

このブログ記事について

このページは、xxxYukihiroxxxが2007年11月14日 20:08に書いたブログ記事です。

ひとつ前のブログ記事は「[wordpress] 再びタイムスタンプチェック」です。

次のブログ記事は「[Flash] 久々にパブリシュしたが・・・」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。