バッチ処理とは
まとめて実施される処理のこと。
cronとは
cron
とは、ジョブを自動実行するためのデーモンプロセス(バックグラウンドプロセス)のこと。
cronを設定するコマンドがcrontabコマンド
。
実際に動かす
ファイル構造
batch_test
├── add_time.php
└── time.txt
add_time.php
現在時刻をtxtファイルに追記するだけのプログラムです。
cronで処理を実行する場合、ファイルパスは絶対パス
で記述する必要があります。require
やinclude
を使用するときも同様です。
<?php
// time.txtに現在時刻を追記する
$file = '/usr/local/var/www/htdocs/batch_test/time.txt';
$current = file_get_contents($file);
date_default_timezone_set('Asia/Tokyo');
$current .= date("Y-m-d H:i:s")."\n";
file_put_contents($file, $current);
time.txt
追記用のファイルです。
こんな感じで現在時刻が追記されていきます。
2019-02-09 22:20:00
2019-02-09 22:21:00
2019-02-09 22:22:00
ファイルを作成したら一度処理を実行してみます。
動作に問題がなければ、引き続きcronの設定に移ります。
$ cd batch_test
$ php add_time.php
cronの設定
cronの設定をcrontabファイル
に記述します。
crontabファイルは「この時間(間隔)でこのファイルの処理を実行する」 という内容を記述するファイルです。crontab -e
コマンドで編集できます。
以下の順番で記述します。
- 処理を実行する時間(または間隔)
- PHPのパス
- 処理が記述されているファイルのパス
最初にPHPの場所を確認します。パスは全て絶対パス
で記述する必要があります。
$ which php
/usr/local/opt/php@7.1/bin/php
crontab -l
コマンドでcronの設定を確認できます。
現在は何も設定されていません。
$ crontab -l
crontab: no crontab for name
crontab -e
コマンドを実行するとviエディタが開くので、処理内容を記述します。(エディタは環境によって異なるかもしれません。)
add_time.phpの処理を1分おきに実行するように設定します。
*/1 * * * * /usr/local/opt/php@7.1/bin/php /usr/local/var/www/htdocs/batch_test/add_time.php
:wp
で確かに保存しましたが、エラーが出てしまいました・・・
$ crontab -e
crontab: no crontab for name - using an empty one
crontab: "/usr/bin/vi" exited with status 1
$ crontab -e
crontab: no crontab for name - using an empty one
crontab: no changes made to crontab
これは:wq
の前に:set backupcopy&vi
を実行することで解決できました。
これで登録されました!
$ crontab -e
crontab: no crontab for name - using an empty one
crontab: installing new crontab
$ crontab -l
*/1 * * * * /usr/local/opt/php@7.1/bin/php /usr/local/var/www/htdocs/batch_test/add_time.php
もっと複雑な処理をさせたいのですが、今日はこの辺で。