CRON
本日は開発のお仕事の話題です。
レンタルサーバーを使っていると「CRON」(クロン)という機能があることに気が付きます。
なんでも処理を定期実行してくれる便利な機能なんだとか。
さくれのレンタルサーバーなんかだと、一番安いプランではCRONは使えなくて、スタンダードプラン以上とかじゃないと使えない機能となっていたりしました。
これまでは縁が無かったので使わずにここまで来ました(^-^;
ただ、現在開発中のWebサイトでは「データの定期更新を行いたい」ので、このCRONを使って自動でDB更新をさせたいな、と。
前に調べた時にはCRONではPHPファイルもコマンド実行できるとかって見た様な気がしましたが、どうなんでしょうか(^-^;?
改めて調べついでに簡単なPHPサンプルも動作させてみたいと思います(^-^)/
CRON調査
まずはCRONで簡単にPHPファイルが実行出来るのか?
・・・(調査中)・・・
見付かりました!
cronを使用してphpファイルを指定した時間に自動実行する方法を記載します。また、その時のcronの設定方法をメモします。
システムを作成しているとログの削除やバックアップ、データの更新などを決められた時間に実行したい場合があります。
cronを使用すると自分でphpファイルを実行しなくても指定した時間で自動実行してくれるので便利だと思います。
ふむふむ。
CRONを使用するとPHPファイルを指定した時間で自動実行してくれるようですね(^-^)v
CRON設定時の書き方にはルールがあるようですね。
- 書式
分 時 日 月 曜日 コマンド
- 設定する値
分 | 0~59の値で指定。*を指定した場合、毎分となる。 |
---|---|
時 | 0~23の値で指定。*を指定した場合、毎時となる。 |
日 | 1~31の値で指定。*を指定した場合、毎日となる。 |
月 | 1~12の値で指定。*を指定した場合、毎月となる。 |
曜日 | 0~7の値で指定。*を指定した場合、毎日となる。 |
コマンド | 実行するコマンドやシェルスクリプトを指定する。 |
実際にコマンドを書くと下記の様になるようです。
10 5 * * * /var/www/html/cron/cron.php
分に「10」、時に「5」、日・月・曜日は「*」でコマンドが「cron.php」というPHPファイルを指定しています。
これをCRON設定すると、毎日5:10にcron.phpを実行してくれることになります。
コマンドはサーバー上の絶対パスで指定しないと動かないそうです。
相対パス指定はダメとのこと。
また、別のPHPファイルをincludeとかで呼び出しているとエラーで落ちる事が多いそうです。
phpスクリプトが一つのファイルで構成されている場合ならば、これでも動く。複数のphpファイルが、相対パスでincludeやrequire__onceとかされている場合、エラーで動かない。
実行時のカレントディレクトリが変わってしまうため、ファイルを参照出来ないから。
解決案
- includeやrequireするときに絶対パスを書く
- (php限定)ini_setでinclude_pathを設定する
- シェルスクリプトを書いて、そいつを実行する
ふむふむ。
CRONはPHPを絶対パスで呼び出して動作させますが、PHPファイル上からincludeする時って相対パスで指定するので、CRON上からは見えない(追えない)位置にファイルがあるから、ダメとの事。
はまったら、解決案も試してみたいと思います(^o^;
CRON試してみる!
まずは簡単なPHPファイルのサンプルを作って、CRON上から呼び出してみたいと思います。
いきなりDB更新は怖いので、ファイルを出力するのをやってみようかと。
ソースは下記。
<?php $fileName = "sitemap"; $fileExt = ".xml"; $item = "CRON_TEST_01"; $f = fopen($fileName.$fileExt, "wb"); fwrite($f, $item); fclose($f); ?>
「sitemap.xml」というファイルを出力するものです。
早速レンタルサーバー上にアップして動作させてみたいと思います!
PHPファイル名は「test_cron01.php」という名前にします。
初CRON指定です。
私の使っているレンタルサーバー上では各設定値を個別に入力して指定で来たので、分だけを2分後に指定して実行予定を組みました!
・・・(2分待機中)・・・
さぁ、2分経過しました!
FTPでディレクトリを確認すると・・・
「sitemap.xml」ファイルが出力されていました!
無事に動きました!
「sitemap.xml」ファイルをメモ帳で開いてみたところ。
「CRON_TEST_01」の文字が出力されています!
(拡張子はXMLですが、単純なテキストを出力したので、こんな内容に(^-^;)
おーし!
こりゃ簡単だ!
普通にコマンドライン上で動作するPHPを組んでレンタルサーバーにアップして、後は絶対パスでPHPファイルを指定して定期実行したい日時を指定してあげるだけで簡単にPHPの自動実行が出来ます!
実際にDB更新するPHPも組んで動作テストしましたが、無事に動きました(^-^)v
こりゃ楽ちん♪