Laravel の php artisan dev に乗り換えたら、composer.json の長い concurrently 行を消せた話
🙌 結論から
Laravel 13.16 以降なら、開発サーバーまわりの起動は php artisan dev に任せてしまうのがかなり楽です。
php artisan dev は 2026年6月16日の v13.16.0 で入ったコマンドです。
サーバー・キュー・ログ・Vite を1つのターミナルでまとめて立ち上げてくれます。
その後も毎週のように手が入っていて、9月22日の v13.33.0 では並び順を決める order() まで増えました👀
私は既存プロジェクトの composer.json にあった長い concurrently の1行を消して、こちらに寄せました。
起動するプロセスを PHP のコードで足したり外したりできるのが、正直一番うれしかったところです(^^)
😴 composer run devの中身を覚えていますか
Laravel 11 から 12 あたりで作ったプロジェクトだと、composer.json の scripts.dev に npx concurrently で4つのコマンドを並べた長い1行が入っていると思います。
あれ、中身をちゃんと覚えてる人は少ないんじゃないでしょうか・・・
私はキューのオプションを変えたいときに、毎回あの1行を横スクロールして探していました。。
今の 13.x のスケルトンを見ると、scripts.dev はこうなっています。
"dev": [
"Composer\\Config::disableProcessTimeout",
"@php artisan dev"
],
つまり、composer run dev の中身そのものが php artisan dev に置き換わっています。
既存プロジェクトも同じ形に書き換えれば、composer run dev の手癖はそのまま使えます👍
💡 起動するのはこの4つです
フレームワーク側で最初から登録されているのは、次の4つです(v13.34.0 のソースで確認)。
| 名前 | 実行されるコマンド | 条件 |
|---|---|---|
| server | php artisan serve | なし |
| queue | php artisan queue:listen --tries=1 --timeout=0 | なし |
| logs | php artisan pail --timeout=0 | Pail が入っていて、PHP で pcntl_fork が使えるとき |
| vite | パッケージマネージャーの run dev | package.json があるとき |
表示のしかたは3つから選べます。
--tabs… コマンドごとにタブで切り替え--stream… 1画面にまとめて流しつつ、TUI で操作できる--inline… 素の出力をそのまま流す(TTY でないときの初期値)
Mac と Linux では、8月11日の v13.25.0 から @laravel/multiplex という Node のツール経由で動くようになりました。
Windows だけは今も concurrently で動きます。
落ちたプロセスは初期設定で自動的に再起動されるので、Vite がこけても気づいたら復活しています✨
どのコマンドが登録されているかは php artisan dev:list で確認できます。
パッケージ側が勝手に足したコマンドもここで分かるので、最初に一度見ておくのがおすすめです。
🔧 私のAppServiceProviderの設定
php artisan dev で動かすプロセスは、Illuminate\Foundation\DevCommands を使って AppServiceProvider の boot() から調整できます。
私のプロジェクトでは、こうしています。
use Illuminate\Foundation\DevCommands;
public function boot(): void
{
// スケジューラも一緒に動かす
DevCommands::artisan('schedule:work', 'schedule')->green();
// キューはリトライありで上書き(同じ名前で登録し直す)
DevCommands::artisan('queue:listen --tries=3 --timeout=0', 'queue');
// タブの並び順を固定する
DevCommands::order(['vite', 'server', 'queue', 'schedule', 'logs']);
DevCommands::withTimestamps();
}
ポイントは、同じ名前で登録し直すと、フレームワークの初期設定より自分のコードが優先されるところです。
ソースを見ると、登録元が vendor の外(自分のアプリ側)なら優先度が一番高くなる作りでした。
キューのオプションだけ変えたい、といった細かい調整が、元のコマンドを消さずにできます(`・ω・´)
逆に外したいときは DevCommands::except('logs') のように名前で除外できます。
パッケージが足したコマンドをまとめて外す withoutVendorCommands() と、フレームワークの4つを外す withoutDefaultCommands() は、9月1日の v13.30.0 で入りました。
ちなみに、モデルやジョブの設定を PHP 属性で書く話は Laravel 13 の PHP 属性の記事 にまとめています。
「設定を PHP 側に寄せる」流れは、13.x 全体で進んでいる印象です。
🤔 logsが出てこなかった話
入れてすぐ、php artisan dev を実行したのに logs のタブだけ出てきませんでした(・_・;)
原因は、logs の登録条件です。
- Laravel Pail(
laravel/pail)がインストールされていること - PHP で
pcntl_forkが使えること
私の場合は、古いプロジェクトで Pail を入れていなかったのが原因でした。
composer require laravel/pail --dev を入れたら、logs も並ぶようになりました。
Windows のように pcntl 拡張が無い環境だと、Pail を入れても logs は登録されません。
チームに Windows の人がいるなら、「logs が無いのは仕様」と README に一言書いておくと、問い合わせが減ると思います。
もう1つ、CI やエージェントのように TTY が無い環境で実行すると、自動で --inline 扱いになります。
Claude Code から php artisan dev を起動させたときに TUI が出なかったのはこれでした。
パパ系Webエンジニア〜愛用ガジェット一覧 🛍️
この記事を書いている作業環境のガジェットを楽天ROOMにまとめています ✨ 在宅エンジニアのデスク作りの参考にどうぞ 🙌
🙌 まとめ
php artisan dev に寄せると、開発用プロセスの管理が composer.json の長い1行から、AppServiceProvider の PHP コードに移ります。
足す・外す・並べ替えるがメソッド1つで済むので、チームで設定をそろえるのもかなり楽・・!
v13.16.0 以降なら使えるので、composer run dev の中身を一度のぞいてみてください🙌
※ バージョン番号・料金・機能は今後も変わる可能性があります。最新情報は公式サイトをご確認ください👀