Posted at

【PHP】バッチ処理をcronで自動実行する


バッチ処理とは

まとめて実施される処理のこと。


「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典〜バッチ処理



cronとは

cronとは、ジョブを自動実行するためのデーモンプロセス(バックグラウンドプロセス)のこと。

cronを設定するコマンドがcrontabコマンド


crontabコマンドについてまとめました 【Linuxコマンド集】



実際に動かす


ファイル構造

batch_test

  ├── add_time.php
  └── time.txt


add_time.php

現在時刻をtxtファイルに追記するだけのプログラムです。

cronで処理を実行する場合、ファイルパスは絶対パスで記述する必要があります。requireincludeを使用するときも同様です。


add_time.php

<?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

追記用のファイルです。

こんな感じで現在時刻が追記されていきます。


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コマンドで編集できます。

以下の順番で記述します。


  1. 処理を実行する時間(または間隔)

  2. PHPのパス

  3. 処理が記述されているファイルのパス


プログラムの自動実行にcronを使おう サンプルプログラム付きで設定も簡単


最初に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 でno changes made to crontabで変更できない時


これで登録されました!

$ 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

もっと複雑な処理をさせたいのですが、今日はこの辺で。