Laravel5.5 バッチ処理

#今回の題
ツイッターbotを作っていた時に、特定のハッシュタグを含んだツイートにリプをつけるという動作を自動化したかった。
そこで15分毎にバッチを走らせて自動でツイートを検索、リプを行うようにした。
その際にlaravelでのバッチ処理を学んだのでメモ。

#バッチ処理作成の流れ

- php artisan make:command HogeCommandでコマンドの作成
- app/Console/Kernel.phpにコマンドを登録。繰り返しの間隔の設定。
- cronの設定

#コマンドの作成
プロジェクトディレクトリに移動して以下のコマンドを実行。
今回私が作ったのが「炊き出しエンジニア」という名前のbotだったので私は以下のように、


```terminal
$ php artisan make:command TakidashiCommand
```
としました。

実行すると、「app/Console/Commands」に「TakidashiCommand.php」が生成される

中身はこんな感じ

```php
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;

class TakidashiCommand extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'command:name';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Command description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        //
    }
}
```

どこに何を書くのか上から説明。

```php

//ここには名前を書いてあげる
protected $signature = 'command:name';
// ⬇︎こんな感じ
protected $signature = 'batch:takidashi';

//ここには説明。
protected $description = 'Command description';
// ⬇︎こんな感じ
protected $description = 'ツイッターボット';

//ここに実行する処理を書く。
public function handle()
{
        //
}

// ⬇︎こんな感じ
public function handle()
{	
    //ここに処理
    //⬇︎コマンドが成功したときに出す文言を決める
    $this->info('successfully');
}

````

コマンドが追加されているか確認

```terminal
$ php artisan list
```
ちゃんと登録されています。
![スクリーンショット 2020-04-28 18.47.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/546124/b49ac7e3-4965-cbc4-2655-d2389f0a6a47.png)

コマンドは以下で実行できます

```terminal
$ php artisan batch:takidashi
``` 

#app/Console/Kernel.phpに登録する
Kernel.phpの内容は初期ではこうなっています。

```php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array
     */
    protected $commands = [
        //
    ];

    /**
     * Define the application's command schedule.
     *
     * @param  \Illuminate\Console\Scheduling\Schedule  $schedule
     * @return void
     */
    protected function schedule(Schedule $schedule)
    {
        // $schedule->command('inspire')
        //          ->hourly();
    }

    /**
     * Register the commands for the application.
     *
     * @return void
     */
    protected function commands()
    {
        $this->load(__DIR__.'/Commands');

        require base_path('routes/console.php');
    }
}
```

説明しながら設定していきます。

```php
//ここには最初に作成したコマンドのクラスを追加します
protected $commands = [
    //
];

// ⬇︎こんな感じ
protected $commands = [
        \App\Console\Commands\TakidashiCommand::class, 
    ];


//ここにはどのコマンドをどんな感覚で実行するか設定する
protected function schedule(Schedule $schedule)
{
    // $schedule->command('inspire')
    //          ->hourly();
}

// ⬇︎こんな感じ
protected function schedule(Schedule $schedule)
{
       //さっき追加したコマンド
       $schedule->command('batch:takidashi')
                //バッチを走らせる間隔を設定。（１５分）
                ->everyFifteenMinutes();
}
````
公式を参考にして好きな間隔でバッチを走らせましょう。
https://readouble.com/laravel/5.5/ja/scheduling.html#schedule-frequency-options

#cronの設定

```terminal
$ crontab -e
```

でcronの設定用のvimが立ち上がります。
以下を記述。

```
* * * * * php /プロジェクトディレクトリまでのパス/artisan schedule:run >> /dev/null 2>&1
````

パスはプロジェクトディレクトリでpwdして調べてくださいね。

以上！


内容に間違えがあったらご指摘いただけると助かります。