SKU: PL-SCHEDULE · v1.0.1 · Core 3.1

GP247の定期タスク管理

無料

バージョンを選択

カテゴリ: Plugin

キーワードタグ: free

インストールをお任せしますか?

お客様のサーバーに導入・設定します。簡単な見積もりの後、固定価格でお受けします。

見積もりを依頼する
説明

🌐 言語: 🇻🇳 Tiếng Việt · 🇬🇧 English · 🇯🇵 日本語(現在)

ScheduledTasks — GP247 / S-Cart 向けスケジュールタスク管理

はじめに

ScheduledTasks は、Laravel Scheduler がサイト上で実行するすべてのスケジュールタスクをサイトオーナーが確認・操作できるようにする無料プラグインです。対象は GP247 コアのタスク(例:キューに入ったメールの送信)、各プラグインのタスク、開発者が書いたサイト独自コードのタスクです。 このドキュメントは、サイトオーナー / 運用担当者(インストール、スケジューラーの有効化、タスクの操作)と開発者(新しいタスクの追加方法)を対象としています。 読み終えると、ご自身の環境でスケジューラーを動かす方法、プラグインが管理者の設定をどのように適用するか、そしてプラグインが自由なコマンド追加を許可せずコードに既にあるタスクだけを操作する理由がわかります。

重要: セキュリティ上の理由から、画面では新しいコンソールコマンドを追加できません。コマンド名や引数を入力することもできません。プラグイン はコードでスケジュール済みのタスクだけを操作します。詳しくは 画面からコマンドを追加できない理由 をご覧ください。

機能

機能 説明
自動検出 Schedule::… で登録されたタスク(場所を問わず)は自動的に画面に表示されます。新しいタスクには「新規検出」ラベルが付き、管理画面の通知ベルでお知らせします
スケジュールの変更 5フィールドの cron 式、次回以降5回の実行プレビュー、コードのスケジュールより頻繁な場合の警告、コードのスケジュールに戻すボタン
オン / オフ コードを変更せずにタスクを一時停止します
今すぐ実行 スケジューラーの次回実行時(1分以内)にタスクを実行するよう印を付けます。ブラウザ内では実行しません
実行履歴 開始時刻、所要時間、ステータス、終了コード、出力の末尾、エラー。90日間保持し、自動で削除します
スケジュール外 手動で、または独自の crontab から実行された artisan コマンドを記録します(スケジュール外で実行されたコマンド を参照)
稼働状況 スケジューラーが動いているか、約何分ごとにどのホストで動いているか、キューワーカーが稼働しているか。サイトにcron がない場合ははっきり表示し、cron の行を用意します
キュー 待機中のジョブ数(database ドライバー)、24時間以内に失敗したジョブ、失敗したジョブの再試行(削除機能はありません)
ログ すべての変更は旧 → 新の値とともに管理画面のログに記録されます

すべてのタスクは多重実行が防止されます。プラグインを無効化またはアンインストールすると、すべてのタスクはコードに書かれたとおりに実行されます。

インストール

  1. ScheduledTasks フォルダーをサイトの app/GP247/Plugins/ にコピーします(または管理画面 →「プラグイン」で ZIP ファイルをアップロードします)。

  2. 管理画面 →「プラグイン」で Scheduled Tasks を探し、「インストール」をクリックします。

    成功すると、「システム」メニューに「スケジュールタスク」が追加されます。

  3. 「システム → スケジュールタスク」を開きます。

    初めて開くと、サイトのスケジュールに現在あるタスクの一覧が表示されます。黄色の枠「このサイトではスケジューラーが一度も実行されていません」が表示された場合は、 スケジューラーを有効にする に進んでください。

要件: GP247 core ≥ 3.0 と Livewire(GP247 の管理画面に同梱)。

スケジューラーを有効にする

スケジューラー(Laravel Scheduler)は、毎分どのタスクが実行時刻を迎えたかを確認するアプリケーションの一部です。スケジューラーは自動では動きません。毎分 php artisan schedule:run を呼び出す仕組みが必要です。 これがないとタスクは一つも実行されず、画面上の設定もすべて効果がありません。ご自身の環境に合った方法を一つ選んでください。

環境 実行方法
共用ホスティング、Linux VPS 毎分の cron(以下の手順)
supervisor のある VPS supervisor のプログラムで php artisan schedule:work を実行(Laravel が毎分の始めに schedule:run を呼び出します)。Web サーバーと同じユーザー(例:www-data)で実行します
Docker php artisan schedule:work(または schedule:run; sleep 60 のループ)を実行するコンテナを、Web コンテナと同じソースコード・環境変数で用意します
Windows(開発マシン) タスク スケジューラで1分ごとに繰り返し、開始フォルダーをサイトのフォルダーにして php.exe artisan schedule:run を実行します。または php artisan schedule:work をターミナルウィンドウで動かしたままにします

ホスティングで cron を追加する方法(cPanel など)

  1. ホスティングの管理パネルにログインし、「Cron Jobs」(「スケジュールタスク」/「Scheduled Tasks」という名前の場合もあります)を開きます。

  2. 頻度で「毎分」(Once Per Minute / * * * * *)を選びます。

  3. コマンド欄に次の行を貼り付けます。/path/to/site はご自身のサイトのフォルダーに置き換えてください。スケジュールタスク画面にはサイトの正しいパスを入れたこの行が 表示されているので、そこからコピーすることもできます。

    cd /path/to/site && php artisan schedule:run >> /dev/null 2>&1
    
  4. 保存し、1〜2分待ってから「スケジュールタスク」画面を再読み込みします。

    成功すると、黄色 / 赤の枠が消え、緑色の行「スケジューラーは稼働中です — 最終実行 …」に変わります。何回か実行されると、 この行に「約 N 分ごと · ホスト: …」も表示されます。

画面からコマンドを追加できない理由

画面で操作できるのは、コードのスケジュールに既にあるタスクだけです(スケジュールの変更、オン / オフ、今すぐ実行)。新しいタスクの追加はできません。 コマンド名や引数の入力欄はなく、php artisan list の一覧から選ぶこともできません。理由は次のとおりです。

  • コンソールコマンドはアプリケーションの全権限で実行されます。 GP247 サイトのコマンド一覧には、データをすべて消去するコマンド (db:wipe、migrate:fresh)、プラグイン / テンプレートを削除するコマンド(gp247:ext-uninstall)、暗号化キーを変更して保存済みのすべての API キーを使えなくするコマンド (key:generate)、サイトをメンテナンスモードにするコマンド(down)、スケジューラーを停止させてしまうコマンド(tinker)が含まれています。Web 上でコマンドを選択・入力できるようにすると、管理者アカウントを一つでも 乗っ取った人がこれらのコマンドを実行できてしまいます。真夜中に自動実行するようスケジュールすることさえ可能です。
  • 引数もコマンド名と同じくらい危険です。 無害に見えるコマンドでも、--force、--execute、--database=… で動作がまったく変わります。
  • コマンド一覧は自動で変わります。 プラグインやパッケージをインストールするたびに変わり、誰も確認しません。「禁止コマンド」の一覧は常に古くなってしまいます。
  • 何を実行するかを決めるのはコードだけです。 コード内のタスクは開発者が書き、テストし、アプリケーションと一緒にデプロイします。 管理者が調整するのは、いつ実行するかと実行するかどうかだけです。

「今すぐ実行」もブラウザ内でコマンドを実行するわけではありません。スケジューラーの次回実行時に実行するよう印を付けるだけです。「今すぐ実行」用の追加の引数 (必要な場合)は、サイトの設定ファイル(run_now_args)でのみ宣言でき、ブラウザから受け取ることはありません。

スケジュールタスクの追加方法(開発者向け)

タスクの追加は開発者がコードで行う作業です。デプロイ後、タスクはスケジューラーの次回実行時に自動的に画面に表示されます (「新規検出」ラベル + 通知ベル)。以降は、管理者が他のタスクと同じように操作します。

サイト独自のコード — ファイル routes/console.php

<?php
use Illuminate\Support\Facades\Schedule;

// 1) artisan コマンド(推奨)
Schedule::command('report:send --daily')->dailyAt('07:00');

// 2) キューに入れるジョブ — ジョブのクラス名で識別
Schedule::job(new \App\Jobs\SyncStock)->everyFifteenMinutes();

// 3) クロージャ — 名前を付けることが必須。付けないと操作できません
Schedule::call(fn () => \App\Support\Cleanup::run())
    ->name('cleanup-temp-files')
    ->hourly();

GP247 プラグイン — ファイル Provider.php の、プラグインが有効かを確認するブロック内

if (gp247_extension_check_active($config['configGroup'], $config['configKey'])) {
    // ...
    $this->callAfterResolving(\Illuminate\Console\Scheduling\Schedule::class, function ($schedule) {
        $schedule->command('myplugin:sync')->everyThirtyMinutes();
    });
}

「プラグインが有効」のブロック内に置くことで、プラグインを無効にするとタスクもスケジュールから消えます。

識別のルール — 書く前に知っておくこと

プラグインはタスクをその識別子で認識します。管理者の設定(独自スケジュール、オン / オフ)はすべてその識別子に紐付きます。

種類 識別子 例
artisan コマンド コマンド名 + 引数(php/artisan のパスは除く) report:send --daily
ジョブ ジョブのクラス名 App\Jobs\SyncStock
クロージャ ->name() で付けた名前 cleanup-temp-files
システムコマンド(Schedule::exec) コマンド文字列 /usr/bin/backup.sh
  • 引数を変える = 新しいタスク。 report:send --daily を report:send --day に変えると別のタスクになります。旧タスクは「コードに存在しません」 と表示され(履歴は保持)、新タスクはコードのスケジュールで実行されます。旧タスクの管理者設定は引き継がれません。
  • コードのスケジュールを変えても識別子は変わりません。 管理者が独自スケジュールを設定している場合、画面に「コードのスケジュールが変更されました: X → Y」と表示されます。
  • 同じ識別子が2回宣言された場合は、宣言順に #2、#3 のサフィックスが付きます。
  • ->name() のないクロージャは件数だけを数え、「識別できない」と警告します。

すべきこと・すべきでないこと

  • すべきこと: 定期的な処理はすべて、ホスティング独自の crontab ではなく Laravel Schedule に入れてください。スケジュール外のスクリプト(bash、curl など)は アプリケーションから見えません。
  • 不要なこと: withoutOverlapping() を自分で追加する必要はありません。プラグインがすべてのタスクの多重実行を防止します。withoutOverlapping(n) を設定した場合は、 ご自身のロック期限 n がそのまま使われます。
  • runInBackground()、onOneServer()、timezone()、environments() は Laravel と同様に動作します。画面は「次回」を タスク自身のタイムゾーンで計算します。
  • 「今すぐ実行」時に専用の引数が必要なコマンド(例:自前の時間帯チェックをスキップする --force)は、サイトの run_now_args で宣言します (カスタマイズ を参照)。

動作の仕組み

スケジューラーの各実行

schedule:run の各実行(毎分)で、Laravel が実行時刻を迎えたタスクを選ぶ前に、プラグインは次のことを行います。

  1. スケジューラーのハートビート(時刻、実行ホスト)を記録します。
  2. スケジュール内のタスク一覧を読み取り、新しいタスクを追加し、既存のタスクを更新します。
  3. 管理者の設定を各タスクに適用し(下表)、その後は通常どおり Laravel に実行させます。

プラグインはどのタスクのコードも変更しません。その実行回のスケジュール、実行条件、多重実行防止のロックを調整するだけです。

管理者の設定の適用方法

設定 効果
独自スケジュール(上書き) 有効なスケジュール = 管理者が設定したスケジュール。設定がなければコードのスケジュール。次回の実行から有効になり、再起動は不要です
コードのスケジュールに戻す 独自スケジュールを削除します。以降、タスクはコードに従います。開発者が後でスケジュールを変更した場合も同様です
オフ 実行時刻になってもタスクは実行されません。実行中の回は停止しません。オフのタスクには目立つ「無効」バッジが付き、一覧の先頭に並びます
オン 有効なスケジュールで再び実行されます
今すぐ実行 印を付けます。次回の実行でタスクを1回実行し(オフのタスクも含む)、その後印を消します
確認済み 「新規検出」ラベルを外します

すべての変更は管理画面のログに記録されます:誰が、いつ、IP、タスク、旧 → 新の値。

実行回のステータス

ステータス 意味
実行中 開始済みで、まだ終了していません
成功 / 失敗 終了コード 0 / 0 以外で終了しました(またはエラー。詳細は履歴で確認)
スキップ(前回の実行が継続中) 実行時刻になりましたが、同じタスクの前回の実行がまだ終わっていませんでした(多重実行防止のロック)
異常終了 「実行中」のまま120分を超えても終了しません(プロセスが途中で停止)。その後実際に終了した場合は更新されます
未実行 タスクにまだ実行回がありません

スケジュール外で実行されたコマンド

手動で、または独自の crontab から実行された artisan コマンドは、次のいずれか一つのグループに該当する場合に「スケジュール外」タブ(閲覧のみ)に記録されます。

  • GP247、プラグイン、またはサイト独自コードのコマンド(routes/console.php に書かれたコマンドを含む)
  • スケジュールに登録されているコマンド(他パッケージのコマンドを含む)— 手動実行はそのタスクにまとめられます
  • サイト設定の external_commands リストに一致するコマンド

スケジューラー自身が起動したプロセスは重複して記録されません。その他のフレームワーク / パッケージのコマンド(例:migrate、optimize:clear) や、artisan コマンドではないスクリプトは記録されません。

スケジューラーの稼働状況

プラグインは crontab やプロセス一覧を読み取りません。schedule:run が実行された各回を認識し、データベースに保存します (キャッシュを削除しても失われません)。画面は実行回の間隔(「約 N 分ごと」)を測定し、実行中のホストを一覧表示します。 php artisan schedule:pause で一時停止されたスケジュールは別途表示されます。

問題が発生したとき

  • 設定を読み取れない(データベースのエラー、テーブルがない)、または履歴の書き込みに失敗した場合 → すべてのタスクはコードに書かれたとおりに実行され、 エラーはログに記録されます。プラグインがスケジュールを止めることは決してありません。
  • プラグインを無効化またはアンインストールした場合 → 操作レイヤーがなくなり、すべてのタスクはコードに書かれたとおりに実行されます。

権限

対象 できること
administrator ロール すべての操作
view.all ロール 閲覧のみ
権限「スケジュールタスク — 閲覧」 閲覧のみ
権限「スケジュールタスク — 設定」 閲覧 + スケジュール変更、オン / オフ、今すぐ実行、失敗したジョブの再試行

これはサイト全体の設定です。各ストア(マルチストア)の管理者はアクセスできません。

カスタマイズ

プラグインの config.php は編集しないでください。このファイルはプラグインを更新するたびに上書きされます。代わりに次のようにします。

  1. サイトのルートフォルダー(config/app.php の隣)に config/scheduled-tasks.php ファイルを作成します。

  2. 変更したいキーだけを書きます。例:

    <?php
    return [
        'retention_days' => 30,              // 実行履歴の保持日数(デフォルト 90)
        'scheduler_stale_minutes' => 5,      // スケジューラーが停止したとみなすまでの最小しきい値(分)(デフォルト 3)
        'record_external' => true,           // スケジュール外で実行されたコマンドを記録(デフォルトはオン)
        'external_commands' => ['backup:*'], // スケジュール外で実行されたときに追跡するパッケージのコマンドを追加
        'run_now_args' => [                  // 「今すぐ実行」時の追加の引数(タスクの識別子ごと)
            'report:send --daily' => '--force',
        ],
    ];
    
  3. サイトで設定キャッシュを有効にしている場合は、新しい値を読み込むために php artisan config:cache を再実行します。

履歴を手動で削除する場合:php artisan scheduled-tasks:purge-runs は削除対象の行数を数えるだけです。--execute を付けると実際に削除します。

アンインストール

プラグインをアンインストールすると、プラグインの3つのテーブル(実行履歴、スケジューラーのハートビート、設定済みのスケジュール / オン・オフ)が削除され、すべてのタスクはコードの スケジュールに戻ります。タスクのコードには影響しません。

ライセンス

MIT — 無料。

条件と制約(操作の前に確認)

スケジュールを変更するとき

  • cron はちょうど5フィールドである必要があります(分 時 日 月 曜日)。構文が誤っているとエラーを表示し、旧スケジュールを維持します。タスクが 「スケジュールなし」の状態になることを防ぐためです。
  • コードのスケジュールと同じスケジュールを保存 = 戻すことになります。独自スケジュールは作成されないので、後で開発者がコードのスケジュールを変更すれば、タスクもそれに従います。
  • 1分未満のタスクはスケジュールを変更できません。 cron 式の最小単位は毎分であり、「10秒ごと」は表現できないためです。
  • コードのスケジュールより頻繁なスケジュールも保存できますが、警告が表示されます。 重いタスクを頻繁に実行しすぎると、ホスティングが過負荷になるおそれがあります。

オン / オフ、今すぐ実行のとき

  • コードのスケジュールに残っているタスクだけが操作できます。 「コードに存在しません」のタスクとスケジュール外で実行されたコマンドは閲覧のみです。 操作すべきスケジュールがもうない(または最初からない)ためです。
  • スケジューラーが稼働していないとき、「今すぐ実行」はロックされます。 印が処理されることはないので、実行されたと誤解しないようロックしています。
  • 実行待ちの間は再度押せません。 各タスクの実行待ちの印は一つだけです。実行が終わると新しい印を受け付けます。
  • 前回の実行が終わっていなければ、新しい実行は待機します。 同じタスクの2つの実行が重なることを防ぎます。

キューを扱うとき

  • 一覧にある失敗したジョブだけを再試行できます。 また、削除機能はありません。ジョブの削除は元に戻せない操作だからです。
  • 待機中のジョブ数を数えられるのは database ドライバーのときだけです。 sync の場合、画面は 0 を表示する代わりに、サイトがキューを使用していないことをはっきり示します。

権限と範囲について

  • 書き込みの操作にはすべて「設定」権限(または administrator ロール)が必要です。閲覧権限だけのユーザーにはボタンが表示されず、無理に 呼び出しても拒否されます。
  • 各ストア(マルチストア)の管理者はアクセスできません。 スケジュールはサイト全体のものであり、特定のストアに属するものではないためです。

よくある質問(Q&A)

Q1: プラグインをインストールしたのに、画面に「スケジューラーが一度も実行されていません」と表示されるのはなぜですか?

→ プラグインは自分でスケジューラーを動かしません。サイトには毎分 schedule:run を呼び出す cron(または supervisor / Docker)が必要です。 スケジューラーを有効にする の手順に従い、1〜2分待ってからページを再読み込みしてください。

Q2: 毎日実行する新しいコマンドを画面から追加できますか?

→ できません。セキュリティのための意図的な仕様です(画面からコマンドを追加できない理由 を参照)。開発者にタスクを コードで宣言してもらってください。デプロイ後、タスクは自動的に画面に表示され、操作できるようになります。

Q3: スケジュールを変更しました。いつから有効になりますか?

→ スケジューラーの次回実行から、通常は1分以内に有効になります。何かを再起動する必要はありません。

Q4: 「今すぐ実行」を押したのにタスクが実行されません。

→ スケジューラーの稼働状況の行を確認してください。スケジューラーが動いていなければ、印は処理されません。タスクの前回の実行がまだ続いている場合は、 新しい実行は前回が終わるまで待機します。結果はタスクの履歴タブで確認できます。

Q5: タスクをオフにすると、実行中の回は止まりますか?

→ 止まりません。オフは以降の実行を止めるだけで、実行中の回は終わるまで実行されます。

Q6: 開発者がコードのスケジュールを変更しましたが、私は独自スケジュールを設定していました。どうなりますか?

→ あなたの独自スケジュールが引き続き使われ、画面に「コードのスケジュールが変更されました: X → Y」と表示されます。コードに従いたい場合は「コードのスケジュールに戻す」をクリックしてください。

Q7: 手動で実行したばかりのコマンドが「スケジュール外」タブに表示されないのはなぜですか?

→ 記録されるのは、GP247 / プラグイン / 独自コードのコマンド、スケジュールにあるコマンド、external_commands に一致するコマンドだけです。他のパッケージのコマンドを追跡したい場合は、 config/scheduled-tasks.php の external_commands にコマンド名のパターンを追加してください。

Q8: ホスティングの cron が5分ごとです。画面にずっとエラーが表示されますか?

→ 表示されません。プラグインは実際の周期を測定し、max(3分, 2 × 周期) を超えた場合にだけ「実行されていない」と表示します。5分ごとの cron なら、新しい実行がないまま10分経過したときです。

Q9: キャッシュを削除(php artisan cache:clear)すると、スケジューラーの状態は失われますか?

→ 失われません。スケジューラーのハートビートはキャッシュではなく、プラグインのデータベースに保存されています。

Q10: プラグインをアンインストールすると、サイトのタスクはなくなりますか?

→ なくなりません。タスクはコードにあるので、コードのスケジュールどおりに通常どおり実行されます。削除されるのは、実行履歴と画面で設定した 内容だけです。


📅 最終更新: 2026-10-22 · ✍️ 作成者 (Author): GP247

Ratings & reviews

0 / 5
0 review(s)
5 0
4 0
3 0
2 0
1 0

Please sign in to write a review.

ログイン

No reviews yet. Be the first to review this product.