トップ / 運用 / cron 自動実行

cron 自動実行

このページでできること

  • サーバの cron で cron/run_survey.php を回し、ブラウザを開かなくても 毎日決まった時刻に自動でスナップショットを取得する方法を理解できます。
  • CLI オプション、ロックファイル、ログ出力先などの仕様を確認できます。

1. 推奨 crontab 例

# 毎日 04:00 に「全プロダクト・本日未取得分」を取得
0 4 * * * /usr/bin/php /var/www/example.com/cron/run_survey.php --product=all --mode=missingToday >> /var/www/example.com/data/cron.log 2>&1

1-A. エックスサーバー(Xserver)での設定例

本ツールの動作確認環境です(Xserver / PHP 8.3.30)。サーバーパネル GUI から登録するのが簡単で、crontab を直接編集する必要はありません。

  1. Xserver サーバーパネル にログイン。
  2. 「アカウント」セクションの 「Cron 設定」 を開く。
  3. 「Cron 結果の通知アドレス」を設定(任意・推奨)。エラー通知用のメールアドレスを登録しておく。
  4. 「Cron 追加」タブで、分・時・日・月・曜日と「コマンド」欄に下記コマンドを入力 → 「確認画面へ進む」 → 「追加する」。
入力例(毎日 04:00 実行の場合)
0
4
*
*
曜日*
コマンド下のコード
cd /home/<サーバーID>/<ドメイン>/public_html && /usr/bin/php8.3 /home/<サーバーID>/<ドメイン>/public_html/cron/run_survey.php --product=all --mode=missingToday >> /home/<サーバーID>/<ドメイン>/public_html/data/cron.log 2>&1

サブディレクトリに配置している場合(例 /public_html/kunugi-geo/)は、cd 先と cron/data/ の親パスを実際の配置先に合わせて差し替えてください。

プロダクトを分割して並行運用する例

プロダクトを 3 件抱えていて、合計取得時間を短縮したい場合は、開始時刻を 1 〜 2 分ずらした 3 つの Cron に分けると並行で走ります(同時間帯にロックファイル名は共通なので、単純に同分でズラさず登録すると後続の cron はロック取得失敗でスキップされます)。

# 04:00 — プロダクト 1
0 4 * * *  cd /home/.../public_html && /usr/bin/php8.3 cron/run_survey.php --product=1 --mode=missingToday >> data/cron.log 2>&1

# 04:30 — プロダクト 2
30 4 * * * cd /home/.../public_html && /usr/bin/php8.3 cron/run_survey.php --product=2 --mode=missingToday >> data/cron.log 2>&1

# 05:00 — プロダクト 3
0 5 * * *  cd /home/.../public_html && /usr/bin/php8.3 cron/run_survey.php --product=3 --mode=missingToday >> data/cron.log 2>&1

2. CLI オプション一覧

オプション説明
--product=<ID>対象プロダクト ID(products.id)。--all-products または --product=all で全プロダクト。
--mode=missingToday(既定)本日のスナップショットが既に存在し、エラーで無いキーワードはスキップ。
--mode=all本日取得済みも含めて全件再取得(コストがフルに発生)。
--no-backup取得開始前の DB バックアップ作成をスキップ。
--no-lockロックファイルを取らない(前回が異常終了した時の復旧用。通常は使用しない)。
--log=FILEログ出力先のファイルパス。指定しないと標準出力+data/cron.log 末尾に追記。
--quiet進捗ログを抑制(エラーのみ)。
--help使い方を表示して終了。

3. 仕様の要点

4. ログの読み方

ログ(data/cron.log)には次のような行が記録されます。

[2026-04-29 04:00:01] [INFO] cron survey start: --product=all --mode=missingToday
[2026-04-29 04:00:01] [INFO] product=12 (自社サービスA) start
[2026-04-29 04:00:32] [INFO] product=12 done: total=24 / success=24 / error=0 / elapsed=31.4s
...
[2026-04-29 04:08:14] [INFO] cron survey done: products=4 / total=120 / success=119 / error=1 / elapsed=493.0s

5. ログローテーション

長期運用するとログファイルが大きくなります。サーバ標準の logrotate 等で月次/週次にローテーションすることを推奨します。

# /etc/logrotate.d/kunugi-geo の例
/var/www/example.com/data/cron.log {
    weekly
    rotate 8
    compress
    missingok
    notifempty
    copytruncate
}

6. cron 環境のヒント

関連