Laravel怎么开启自定义Artisan命令 _ Laravel 自定义Command编写方法【经验】

1次阅读

注册自定义artisan命令需手动创建类并显式注册,类须继承illuminateconsolecommand、实现handle()方法,$signature不能为空或重复;输出依赖cli上下文,非cli环境需用artisan::call()调用;参数选项格式须严格,大数据处理应分块避免内存溢出。

Laravel怎么开启自定义Artisan命令 _ Laravel 自定义Command编写方法【经验】

怎么注册一个自定义 Artisan 命令

必须手动在 app/Console/Commands/ 下创建类,并在 app/Console/Kernel.php$commands 数组里显式注册,laravel 不会自动扫描或加载。

  • 命令类需继承 IlluminateConsoleCommand,且必须实现 handle() 方法(否则运行时报 Method handle does not exist
  • 类名末尾建议带 Command 后缀(如 SendWeeklyReportCommand),否则 php artisan list 可能不显示描述
  • 别漏掉 protected $signature = 'report:send'; —— 这是命令的唯一标识,空值或重复会导致 Command already registered

为什么 handle() 里用 $this->info() 没输出

常见于在队列任务或测试环境中调用命令时:Artisan 命令的 I/O 绑定依赖 Application 实例的当前终端上下文,直接 new 实例或在非 CLI 环境中调用,$this->outputNULL

  • 正确触发方式只有 php artisan report:sendArtisan::call('report:send')
  • 若要在其他地方复用逻辑,把核心逻辑抽到 Service 类里,handle() 只负责参数解析和调用,别塞业务代码
  • $this->line()$this->Error() 等方法底层走的是 symfony Console 的 OutputInterface,不是 echo,所以不能靠浏览器看输出

如何传参和选项并避免解析失败

$signature 字符串写法直接影响参数是否被识别,空格、冒号、等号位置错一位就报 Not enough arguments 或静默忽略。

  • 必需参数:user:import {file} → 运行时必须跟值:php artisan user:import users.csv
  • 可选参数:user:import {file?}{file? : default.csv} 支持默认值
  • 选项(带 –):{--force}(布尔)、{--env=}(需值)、{--env=production}(带默认)
  • 别写 {--force=true} —— 这会被当成字符串值,实际想传布尔就用 --force 不带等号

命令执行慢或卡住,怎么排查

Artisan 命令默认在主进程同步执行,没超时控制,也没自动重试,一旦底层调用阻塞(比如 http 请求、DB 锁、大文件读取),整个命令就挂住。

  • set_time_limit(0)handle() 开头?别——PHP CLI 默认不限时,加了反而可能干扰
  • DB::transaction() 包裹写操作,但记得捕获 QueryException,否则异常后事务不回滚,下次运行可能因数据状态异常失败
  • 大量数据处理务必分块:User::query()->chunkById(100, function ($users) { ... }),别用 get() 全查进内存
  • 日志写到 storage/logs/laravel.loginfo() 输出更可靠,尤其后台运行时

命令真正难的不是写法,是它跑在哪儿、谁调用、失败了有没有人知道。别让一个定时任务里的 php artisan clear:cache 因权限问题静默失败,然后三天后才发现缓存没清。

text=ZqhQzanResources