Laravel Artisan 命令退出码默认成功为 0、失败为非零值,可在 handle() 中 return 显式指定;测试用 assertExitCode() 等断言,外部调用通过 $? 或 Process::getExitCode() 获取;禁用 exit()/die(),避免隐式返回。

在 Laravel 中,命令行执行的退出码(exit code)是判断 Artisan 命令是否成功完成的关键依据。默认情况下,Laravel 命令成功返回 0,失败返回非零值(如 1)。你可以主动控制、获取和断言这个值。
自定义命令中的退出码返回
在自定义命令的 handle() 方法中,直接用 return 语句指定整数即可作为退出码:
- 返回
0表示成功(推荐显式写出,增强可读性) - 返回
1或其他非零整数表示失败(如数据校验不通过、外部服务不可用等) - 不写
return语句时,PHP 默认返回NULL,等价于退出码0—— 但不建议依赖此行为
示例:
class SendEmails extends Command {protected $signature = 'email:send';
public function handle() {
if (!$this->sendEmail()) {
$this->error('Failed to send email.');
return 1;
}
$this->info('Email sent successfully.');
return 0;
}
}
在测试中验证退出码
Laravel 测试提供了简洁的断言方法来检查命令执行结果:
-
assertExitCode(0):断言退出码等于指定值 -
assertSuccessful():等价于assertExitCode(0) -
assertFailed():等价于assertExitCode(1)(注意:仅匹配 1,不匹配其他非零值) -
assertNotExitCode(1):断言退出码不是某个值
示例测试:
test('email:send fails when network is down', function () {$this->artisan('email:send')
->assertExitCode(1);
});
从外部调用时获取退出码
如果你在 Shell 脚本、CI/CD 流程或 PHP 中用 exec/shell_exec 运行 Artisan 命令,可通过系统机制捕获退出码:
- Bash 中:执行后立即查看
$?变量 - PHP 中使用
Process门面:
$process = Process::command('php artisan email:send');
$process->run();
$exitCode = $process->getExitCode(); // 返回 int
注意:未捕获异常(如数据库连接失败)会自动触发退出码 1,无需手动 throw;但若想区分不同错误类型,应主动 return 不同数值(如 2 表示配置缺失、3 表示权限不足)。
常见误区提醒
- 不要在
handle()中用die()或exit()—— 会跳过 Laravel 的清理逻辑和输出缓冲 - 避免依赖未声明的返回值:即使函数没写
return,也请明确返回0或对应错误码 -
assertFailed()只检查是否为 1,不能替代assertExitCode(n)判断具体业务错误码


















