久しぶりにXサーバーのCRONを使ってLaravelの関数を実行しようとしたけれど、情報がどれも古くて、まる1日苦戦したので、防備録として記録しておきます。
これでapp/console/Commands以下にBookingsCommand.phpのファイルを作る
$ php artisan make:command BookingsCommand
できたBookingsCommand.phpのファイルがこちら。これに実行したいコマンドやバッチ処理などを書き込んでいく。
namespace App\Console\Commands; use App\Http\Controllers\Api\CronsController as ApiCronsController; use Illuminate\Console\Command; class BookingsCommand extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'command:booking';//ここのbookingは自由に /** * The console command description. * * @var string */ protected $description = 'Command description'; /** * Execute the console command. * * @return int */ public function handle() { // return Command::SUCCESS; $batch = new ApiCronsController();//これで呼び出す $batch->test(); // ApiCronsController::test(); } }
ちなみに、ここでのApiCronsControllerのtestの中身はただ単にLOGに書き出すのみ。
public function test() { Log::debug('test1'); }
まずはこれでコマンドで実行してみる
php artisan command:booking
これだけで、このようなログが吐き出されるはず。
[2023-09-15 16:01:02] DEBUG: test1
このままでも下記で実行できるが、タスクスケジュールに入れて実行もできる。
このままXサーバーのCRONで動かす場合。
XサーバーのCRONの時間やコメントなどの設定は他サイトにたくさん記載されているのでここでは割愛させていただきます。
実行はこのように書く。
cd /home/〇〇/〇〇.com/〇〇/src && /usr/bin/php8.0 artisan command:booking
〇〇はご自身の環境で,srcも必要な場合に記述してください。
php8.0はphp8でやると下記のエラーで動かないので必ず8.0や8.1などのように書く。
/bin/sh: /usr/bin/php8: そのようなファイルやディレクトリはありません
タスクスケジュールに入れて実行する場合
src/app/Console/Kernel.php
class Kernel extends ConsoleKernel { /** * Define the application's command schedule. * * @param \Illuminate\Console\Scheduling\Schedule $schedule * @return void */ protected function schedule(Schedule $schedule) { // $schedule->command('inspire')->hourly(); $schedule->command('command:booking')->everyMinute();//ここではテストのため毎分 ここにコマンドを入れる } /** * Register the commands for the application. * * @return void */ protected function commands() { $this->load(__DIR__ . '/Commands'); require base_path('routes/console.php'); } }
これを実行する場合
php artisan schedule:run
これをXサーバーのCRONで動かす場合
cd /home/〇〇/〇〇.com/〇〇/src && /usr/bin/php8.0 artisan schedule:run
とするとOK
なお、最後の部分に
>> /dev/null 2>&1
を入れると、CRONのメール通知にメールアドレスを入れていてもメール通知は来なくなります。
cd /home/〇〇/〇〇.com/〇〇/src && /usr/bin/php8.0 artisan schedule:run >> /dev/null 2>&1