PHPのプログラムを時間を決めて実行したり、定期的に実行したい場合があるでしょう。そうした場合、UnixやLinuxなどのOS環境ではcronというデーモンプロセスを利用すると簡単に実現できます。
ここでは、PHPのスクリプトやプログラムをcronで実行する方法を説明します。
PHPプログラミングに興味のある方は、プログラミング学習の参考として、ぜひ読んでみてください。
目次
cronとは
cronはUnix/Linux系OSのデーモン
cronはUnix/Linux系OSのデーモンとよばれるもので、プログラムやスクリプトを特定の周期で実行するための便利な手段です。
ユーザーは、実行したいタスク(スクリプトやコマンドの総称)に関する情報をcrontabファイルに登録します。
crontabファイルの各行には、タスクをどんな周期で実行したいかを記述します。
cronで実行したいタスクの登録などの編集を行なうにはcrontabコマンドを使用します。crontabコマンドは指定されたユーザーのcrontabファイルに処理結果を反映します。
crondというデーモン(OSのプロセス)が時刻をチェックしながらcrontabファイルに記載されたタスクを起動を制御します。
cronで実行するタスクの記述
タスクの記述
crontabファイルの各行に、以下の構文で実行するタスクを定義します。なお、以下の構文でわかるように、crontabでは分きざみより細かいタイミングではタスクを起動できません。
1 2 3 4 5 6 7 |
* * * * * 実行するコマンド | | | | | | | | | --曜日フィールド(0~6) | | | -----月フィールド(1~12) | | --------日フィールド(1~31) | -----------時フィールド(0~23) --------------分フィールド(0~59) |
分・時・日・月・曜日フィールドの書き方
分から曜日までの各フィールドには以下のように複数の値を設定可能となっています。
設定法 | 説明 | 記述例 |
列挙 | コンマ (,) で値のリストを指定 | 1,2,6 |
範囲指定 | ダッシュ (-) で値の範囲を指定 | 1-6(1,2,3,4,5,6と同じ) |
間隔指定 | スラッシュ (/) で間隔を指定 | */10(時なら0,10,20と同じ) |
全て | アスタリスク (*) | *(分なら1分毎と同じ) |
実行コマンド
スクリプトや実行モジュールを絶対パスで指定します。パラメタにファイルを指定す場合も絶対パスとします。
記述例
毎月1日と15日の23:59にphpスクリプト/var/www/hoge/sample.phpを動かす
1 |
59 23 01,15 * * /usr/bin/php /var/www/hoge/sample.php |
毎月1日の10:00から15:00まで1時間おきにphpスクリプト/var/www/hoge/sample.phpを動かす
1 |
0 0 10-15 * * /usr/bin/php /var/www/hoge/sample.php |
10分間隔でphpスクリプト/var/www/hoge/sample.phpを動かす
1 |
*/10 * * * * /usr/bin/php /var/www/hoge/sample.php |
毎週土曜日と日曜日の23:59にphpスクリプト/var/www/hoge/sample.phpを動かす
1 |
59 23 * * 0,6 /usr/bin/php /var/www/hoge/sample.php |
crontabコマンド
cronのタスクを編集するにはcrontabコマンドを使います。crontabコマンドでは処理内容を以下のオプションで指定します。
1 |
crontab [-e [-u username] | -l [-u username] | -r [-u username] | file] |
オプションの意味は以下のとおりです。
オプション | 説明 |
-e | crontabファイルを編集する |
-l | crontabファイルの設定内容を表示する |
-r | crontabファイルの設定を削除する |
-u | cronを設定するユーザーを指定 |
コマンドライン(CLI)については、以下も参考にしてください。
【初心者向け】PHPのCLIを紹介!CLIのインストールから実行を解説!PHPをcronで動かす
呼び出された時刻を表示する簡単なPHPスクリプトをサンプルとして、cronでphpを動かす例を紹介します。
以下の内容のファイルsample.phpを作ります。
1 2 3 4 5 |
<?php $file = "/var/www/yoss/test/time.txt"; $startTime = "cron start at ".date("Y-m-d H:i:s")."<br>\n"; file_put_contents($file, $startTime, FILE_APPEND); ?> |
このスクリプトを1分ごとに起動するには、以下のような行をcrontabファイルに追加します。
1 2 3 4 |
* * * * * <phpのあるディレクトリを絶対パスで記述>php <sample.phpのパスを絶対パスで記述>sample.php (例) * * * * * /usr/bin/php /var/www/yoss/test/sample.php |
crontabのlオプションで記述内容を確認できます。
cronが実行されるとファイルtime.txtにcronの起動時刻が毎分ごとに書き込まれているはずですので、それを以下のphpスクリプトを作ってwebで確認してみます。
1 2 3 4 5 |
<?php $file = "/var/www/yoss/test/time.txt"; $fileRead = file_get_contents($file); echo $fileRead; ?> |
実行結果例
1 2 3 4 |
cron start at 2021-04-25 23:22:01 cron start at 2021-04-25 23:23:01 cron start at 2021-04-25 23:24:01 cron start at 2021-04-25 23:25:01 |
PHPをコマンドラインから実行する方法については以下も参考にしてください。
PHPをコマンドラインで実行する方法について詳しく解説!cronを使う際の留意事項
crontabファイルの記述に誤りがある場合
crontabコマンドで編集をして保存したときに、ファイル内容に誤りがあればエラーメッセージが表示されます。
例)分に誤って60と記入
エラーメッセージは以下のとおりです。
y(es)/n(o)の入力を要求されるので、yを選択すれば編集画面に戻り、nを選択すれば、編集がキャンセルされます。
phpのありかを探すには
phpの絶対パスは、使用しているOSの種類によって異なります。linuxでは実行コマンドのフルパスを調べるwhichコマンドを使って確認します。
Windowsでcronと同じことをするには
WIndowsでcronと同じことをするには、PHPスクリプトを起動するバッチファイルを作成し、それをWindowsのタスクスケジューラーに設定することで可能です。
WIndowsでPHPを動かすための環境設定については以下も参考にしてください。
【初心者向け】XAMPPのインストール方法を解説!まとめ
いかがでしたか? 今回は、cronを使ってPHPスクリプトを自動実行する方法を紹介しました。
phpでのデータベースメンテナンスやログメンテナンスなどスケジューリングされたPHPプログラムを動かしたい場面はいろいろ考えられます。cronの扱い方をきちんと理解しておけば、きっと役に立ちます。
この記事が、PHPプログラミングの学習の参考としてお役に立てば幸いです。