Jan 19 2008

XREA & CORESERVER の cron と WordPress の wp-cron

UNIX 系の OS には cron と呼ばれる、コマンドのスケジュール実行機能が備わっています。 基本的には UNIX のコマンドを指定された時期に呼ぶだけの機能なので、実行可否によって次の実行分岐をしたりするジョブスケジューラ的なことをするには不向きですが、簡単な定期実行くらいなら便利に使うことができます。

最近のレンタル Web サーバでは、この機能をユーザに提供しているところも多く、特にスクリプト系の Web アプリケーションのような、ユーザのアクセス契機でしか動作しないプログラムを補完する役割で cron が使われているようです。(RSS リーダの RSS 定期取得とか)

また、我らが WordPress には、この UNIX の cron とは別に、コアに wp-cron と呼ばれる(?)一連のファイルで、cron の擬似的な実装が含まれています。 ではとりあえず、WordPress の wp-cron のことから書いてみます。

WP-Cronは動いてるのか? « MMRT daily life

TB多重送信防止のため、Google XML Sitemapsをバックグラウンドで動かす設定にしたわけだが、今日確認すると投稿前日に生成されたままだ。よくわからないのだが、投稿ボタンをクリックしてから一体何秒後、何分後、何時間後に作動するのか? はたまた作動しているが失敗しているのか? 疑問は尽きない。

まずは、wp-cron の基本的な動作原理から。

一般的なスクリプト系の Web アプリケーションというのは、動作の契機がユーザによるブラウザアクセスにより始まります。 その動作は継続することはなく、ユーザのアクセス終了(画面描画)となれば、そのアプリケーションはメモリから消滅します。

てなわけで、プログラム動作が持続しないため、定刻動作などはできないわけなのですが、これをなんとか擬似的に再現したのが wp-cron です。

  • スケジュールしたい仕事があったら、とりあえず、いつ起動するのかとかなにを動かすのかとかを WordPress DB に登録。
  • ユーザからの WordPress へのアクセスがあったら、必ず上記 DB を参照して、いまやるべきことがないかを確認して、あるならサイト表示とついでにバックグラウンドで実行。

という動きです。

・・・お気づきかと思いますが、きっかけはユーザからのアクセス、ブラウザによる閲覧ですので、もし仮にそのサイトがその後1アクセスもなければ、いっくらスケジュールしておいてもなにも実行されません。 :-)

wp-cron は、遅延したスケジュールがあれば一気にそれを実行しようし、「遅刻はするけどいつかは実行してやっか」「まぁ1秒間に1回のアクセスはなくても、10分に一回くらいのアクセスならどこのサイトでもあるだろ」くらいの思想で実装されています。

ちなみに、wp-cron の時間の指定の仕方はいくつかありますが、Masayan さんが使われている Google XML Sitemap とか、ぼくのつくった wp-lwSitemap とか、コア標準のトラックバックの送信機能であるとかは、"次の誰かのアクセス" というスケジュールの仕方をしています。

また、cron の特徴とは違いますが wp-cron によるアクションの"実行"は、ちょっと特殊な方法がとられていて、ユーザの閲覧のプロセスとは別のバックグラウンドで動くようにつくられています。 要は閲覧する人の実行動作が重くなったりはしないようになっています。

これは閲覧プロセス(PHP)から、 cron ジョブ実行プロセスを司るファイルにたいして、"socket を一瞬つないで"、あたかも PHP をブラウザと同様にアクセスしてきた別ユーザのように偽装して動作しています。 PHP くんがいくら待たされても、だれもいらいらしないってことですね。(レンタルサーバ管理者はいらいらする?(笑)

また、このようにすると閲覧プロセスと cron ジョブが平行して動作をするため、閲覧 + cron ジョブと続けて実行するよりも、メモリ等のリソースを各プロセスがサーバから多く取ることができるという特徴もあります。(なので多くのエントリを持つサイトで Google XML Sitemap をバックグラウンド設定するとうまく動作するときがある。 これは昔の Google sitemaps のひろまさハックの動作と同様)

このように wp-cron は若干 hackish。 本家 UNIX cron が使えるのならば、時と場合によってそちらを使ったほうがいい場合もあります。

じゃーってことで、XREA & CORESERVER における 本家 cron の設定の仕方を紹介してみます。 他のレンサバでも同じような物だと思います。

WP-Cronは動いてるのか? « MMRT daily life

しかし、XreaはCRONが使えるじゃろ?と言われるだろうが、CRONジョブの設定ってどうするのさ? 相対パスで入力するところに例のURLをそのまま入れても使えないんじゃね?と思ったから。知ってる人がいたら教えて欲しいなぁ。

普通の UNIX のコマンドの cron の定期実行ってのはわりといろんなところに書かれているので、ここでは Masayan さんのやりたいような PHP などの Web アプリの定期実行の方法を書いてみます。

まず cron が実行できるのは、UNIX でいうところの実行ファイルです。 Windows でいえば、 .exe ファイルですが、UNIX 的には実行権限のついたファイル。 FTP でおなじみの、 700 とか 707 とか 7 が付いたファイル。(というと語弊があるかもしれないが、そんな感じです)

じゃー、実行したいのが .php のファイルなのでそれに 707 つけて指定してあげればいいかというと、これは残念ながらダメです。 .php のファイルを解釈できるのは、PHP のインタープリタだけだからです。 cron に指定するのは、UNIX が解釈できる実行ファイルでないとだめであります。

PHP のインタープリタって何?って話ですが、これは簡単で、php ってコマンド。

php -f hogehoge.php

ってうつと、hogehoge.php が実行されます。 cron の場合は、フルパスで指定しなければならないので、 /usr/bin/php とかになるんかな。 で、その後ろの hogehoge.php もフルパスにすればいけるはず。。

めんどくせ!

おまけにこれは動作確認しずらいので、ここでは別な方法を書いてみます。

UNIX の実行できる(cron に登録できる)ファイルにシェルというのがあります。 これをまずサーバ上におきます。 ワンクッションおきこのシェルに動作手順を書いて、cron に実行してもらいましょう。

これは、ユーザに閲覧される必要がないファイルなので、public_html より上のディレクトリにおきましょう。 たとえば、cron ってディレクトリをつくる。

Image2

で、その中に以下のようなファイルをつくります。 ファイル名は何でもよく、拡張子は一般的には .sh。 必ずアスキーモードで FTP 転送し、権限を 700 に指定。

fetch.sh (実際のファイルに行番号はいりません)

   1: #!/bin/sh
   2:  
   3: cd /virtual/[ユーザ名]/cron/
   4: wget http://[実行したい.phpのURL] -O result

[ユーザ名]と[URL]は適宜変更のことです。

wget というのは、コマンドラインの http クライアントです。 .php はブラウザでアクセスされると動くので、UNIX のコマンドラインブラウザ(?)で定期閲覧してあげるわけです。(上で書いた php -f でもいけるかと思いますが、UNIX パスより wget の http 表記のほうが分かりやすいかと思いこうしています)

でもって、レンタルサーバの cron 設定画面で、この .sh をフルパスで指定。

Image5

cron/fetch.sh

時間はお好みで設定してください。 上の例は毎時 0 分に実行。これで、 http://[実行したい.php のURL] のスクリプトが定期実行されます。

また、実行結果がメール通知され、 cron/ ディレクトリには毎回 result とかってファイルができるはずです。(この辺は各自調整してください)

これで cron の設定ができるようになりました。 cron が使えるようになると、 MySQL の定期バックアップとかもできるようになるので、興味があればやってみてください。 :-)

うわ、なげー。。 以上、wp-cron と cron の説明でした。(オチはない

11 Comments

  1. 投稿日時: 2008 年 1 月 20 日、Morning | パーマリンク

    1個人のため?にわざわざご説明をありがとうございます。(苦笑)

    あぁそうすればいいんですね。
    よくよく考えるとサーバのアクセスログを見るのにawstatsを入れているのですが、毎日実行するのに***.shをCRONで叩いてました。(汗)

    以上、まったく応用力のないMasayanでした。(情けねー)

  2. ひろまさ
    投稿日時: 2008 年 1 月 20 日、Daytime | パーマリンク

    Masayan さん、こんにちは。 :D

    >よくよく考えるとサーバのアクセスログを見るのにawstatsを入れているのですが、毎日実行するのに***.shをCRONで叩いてました。(汗)

    おーまさに! その .sh の後ろの行にに sitemap も追加すると楽かも知れません。ただ .sh の実行時間制限あったはずなので、時間かかりすぎると XREA に落とされるかも。。 その場合は別時間、別 .sh のほうがいいかもしれません。

    Sitemap ができたりできなかったりする問題はおそらくは、サーバのリソース不足です。 深夜とか空き時間帯をねらって cron するとたぶん大丈夫なんじゃないかな~って想像しています!

  3. 投稿日時: 2008 年 1 月 20 日、Daytime | パーマリンク

    wp-cronって…そんな実装だったのね…

    ほほぉ~wp-cronって、そんな実装だったのねぇ…ひろまささんのページを読んで理解

    hiromasa.another :o ) » Blog Archive » XREA & CORESERVER の cron と WordPress の wp-cron via kwout
    ある意味考えてみれ…..

  4. 投稿日時: 2008 年 9 月 3 日、Daytime | パーマリンク

    [...] wordpressにはwp-cronという機能があります。詳しい説明はこちらを。XREA&Coreserverのcronとwordpressのwp-cron [...]

  5. 投稿日時: 2009 年 1 月 14 日、Nighttime | パーマリンク

    WordPress:トラックバックが出来ない!…

    注:以下は、WordPress Ver2.6.2での情報です。
    トラックバックとは何ぞや?という方には下記。

    3分でわかるトラックバック(Flash)
    トラックバック技術仕様書

    12月某日、このブログからリ….

  6. 投稿日時: 2009 年 7 月 4 日、Nighttime | パーマリンク

    [...] 一番分かりやすい説明がここだった。 XREA & CORESERVER の cron と WordPress の wp-cron [...]

  7. 投稿日時: 2009 年 9 月 9 日、Daytime | パーマリンク

    [...] だいたいの仕組みがわかったところでググってみたら、詳しい説明が見つかりました。 http://another.maple4ever.net/archives/130/ [...]

  8. 投稿日時: 2009 年 9 月 23 日、Daytime | パーマリンク

    [...] XREA & CORESERVER の cron と WordPress の wp-cron [...]

  9. 投稿日時: 2010 年 1 月 8 日、Daytime | パーマリンク

    WordPress:「トラックバック送信先」に送れない問題が解決した…

    最近、WordPressの記事作成時、「トラックバック送信先」にURLを書いても送信されず、そのまま残る問題が発生していました。 「相手側の問題なのかなー?」と気になりながらも放置していましたが、アチコチ送ってるのに全く反映されず、これはどうやら自分側の問題だろうと判断し、解決方法を探してみました。 問題の原因 Googleさんにお伺いを立てたところ、「WordPress:トラックバックが出来ない! – マゼランな航海」で似たような問題を発見。 曰く、sockopenのタイムアウトが「0.01秒」と…

  10. 投稿日時: 2010 年 1 月 13 日、Daytime | パーマリンク

    Google XML Sitemaps Generatorの手動更新の自動化…

    先日の記事のとおり、Google XML Sitemaps Generatorの手動更新のcronが止まってしまったので違う方法を考えなければならない。実は、昔々にも師匠に泣きついたことがあった。 > XREA & CORESERVER の cron と WordPress の wp-cron » hiromasa another 師匠はちゃんと教えてくれているのにその時のボクはこれを実行できませんでした。 どうにもこうにも待てど暮らせど、更新することが出来なかったのです。その…

  11. 投稿日時: 2010 年 1 月 22 日、Nighttime | パーマリンク

    [...] hiromasa.another ) » Blog Archive » XREA & CORESERVER の cron と WordPress の wp-cron. [...]

Post a Comment

メールアドレスから Gravatar が取得されます。(必須ではありません)

次の HTML タグと属性が使用できます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Trackback

http://another.maple4ever.net/archives/130/trackback/