トップ / 運用 / 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 を直接編集する必要はありません。
- Xserver サーバーパネル にログイン。
- 「アカウント」セクションの 「Cron 設定」 を開く。
- 「Cron 結果の通知アドレス」を設定(任意・推奨)。エラー通知用のメールアドレスを登録しておく。
- 「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/ の親パスを実際の配置先に合わせて差し替えてください。
<サーバーID>は Xserver 契約時に発行される英数字 ID(例xs132374)。<ドメイン>はクヌギGEO を配置している独自ドメイン(例example.com)。- PHP CLI のフルパスは
/usr/bin/php8.3(PHP 8.3 系)。Xserver は PHP のメジャーバージョンごとに/usr/bin/php7.4//usr/bin/php8.0//usr/bin/php8.1//usr/bin/php8.3といった専用バイナリを提供しています。最新パスはサーバーパネルの「サーバー情報 → コマンドパス一覧」で確認可能。 cdでスクリプトディレクトリへ移動してから実行することで、require __DIR__ . '/...'の相対 require を含むスクリプトでも問題なく動きます。- 標準出力に何か出ると 「Cron 結果の通知アドレス」へ毎回メールが届きます。エラー時のみ通知したい場合は、コマンド末尾を
> /dev/null 2>/dev/nullに変更し、ログはアプリ内の cron 実行ログ 画面から確認する運用も可能です。 - 共用サーバの仕様で 1 ジョブあたりの実行時間に上限がかかる場合があります。大量キーワードを抱える場合、調査実行管理 の曜日スケジュールを使って軸を曜日別に分散するか、
--product=<ID>をプロダクトごとに分けて複数 Cron 行に分割してください。
プロダクトを分割して並行運用する例
プロダクトを 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. 仕様の要点
- CLI 専用: HTTP 経由で実行された場合は 403 で終了します。
- 実行時間制限:
set_time_limit(0)で無制限化。memory_limit = 512Mを強制設定。 - 同時多重起動の防止:
data/cron_survey.lockをフロックします。前回が異常終了した場合のみ--no-lockを付けて手動回避。 - 曜日スケジュール反映: 調査実行管理(曜日) で OFF にした軸は、cron 内でも明示スキップ。コストは発生しません。
- 全プロダクト処理:
products.sort_order, id順で 1 件ずつ処理。途中で 1 プロダクトが失敗しても、残りは続行します。 - サマリー出力: 1 プロダクト毎にミニサマリ、最後に全体合算サマリ(成功 / 失敗件数、所要時間)を出力します。
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
- error が 0 でない日は、手動での調査実行 画面で「本日未取得・エラーのみ」モードで再実行すると、エラーになったキーワードだけを再取得できます。
- 残高不足が原因のときは、DataForSEO API 管理 から残高をご確認ください。
5. ログローテーション
長期運用するとログファイルが大きくなります。サーバ標準の logrotate 等で月次/週次にローテーションすることを推奨します。
# /etc/logrotate.d/kunugi-geo の例
/var/www/example.com/data/cron.log {
weekly
rotate 8
compress
missingok
notifempty
copytruncate
}
6. cron 環境のヒント
- cron で実行されるシェルは
$PATHが短いことが多いので、phpは絶対パスで指定するのが安全です(which phpで確認)。 - 共用サーバの cron 設定 UI(cPanel など)から登録する場合、ログ出力リダイレクトの書き方が異なる場合があります。サービス提供側のヘルプを参照してください。
- 長時間実行が cron からタイムアウトされる場合は、
nohupやatを使うか、サーバ側の cron 実行最大時間を引き上げてください。
関連
- インストール方法 → cron 設定
- cron 実行ログ:cron が出力したログをブラウザ上で閲覧(システム管理者(admin)限定)
- 手動での調査実行:失敗した取得を再実行する際に使用します
- 調査実行管理(曜日):cron が参照するスケジュール