ThinkPHP 6 定时任务不支持 cron 表达式传参,参数必须通过命令行显式传递:在 configure() 中用 addArgument() 和 addOption() 声明,调用时写死在 crontab 命令中(如 php think sync:order-status 2026-08-06 --force),并在 execute() 中用 argument() 和 hasOption() 获取处理。

ThinkPHP 6 定时任务本身不直接支持“参数传递”给定时逻辑,真正可传参的是命令行指令——也就是你用 php think xxx:command 手动或通过 crontab 调用的那个命令。参数必须在调用时显式传入,不能靠 cron 表达式自动注入。
命令行参数:argument 和 option 的正确用法
在自定义命令类(如 app\command\SyncOrderStatus)中,configure() 方法里定义的参数,才是实际能被传入的入口:
-
必填参数(argument):用
$this->addArgument('date', Argument::REQUIRED, '同步日期,默认为 today')声明;调用时写成php think sync:order-status 2026-08-06,代码里用$this->argument('date')获取;未传会报错,所以推荐带默认值:$this->argument('date', 'today') -
可选开关(option):用
$this->addOption('force', null, Option::VALUE_NONE, '强制重跑')声明;调用时写成php think sync:order-status --force或--force=1;判断是否启用应写$this->hasOption('force'),而不是!empty($this->option('force'))——因为--force不带值时返回true,带值才返回字符串
crontab 调用时如何传参
Linux cron 本身不解析参数语法,它只是按字符串执行命令。所以参数必须写死在 cron 行里:
- ✅ 正确写法:
0 2 * * * cd /var/www/myapp && /usr/bin/php think sync:order-status 2026-08-06 --force >> /var/log/cron-sync.log 2>&1 - ❌ 错误写法:
0 2 * * * php think sync:order-status(没传参,且没指定路径和 PHP 解释器) - 注意:绝对路径必须完整,
cd切到项目根目录再执行,否则配置、数据库连接等都可能失败
运行时动态计算参数(如“昨天”)
如果不想硬编码日期,可在 execute() 方法里用 PHP 计算:
立即学习“PHP免费学习笔记(深入)”;
- 例如获取“昨天”:
$date = $this->argument('date', date('Y-m-d', strtotime('-1 day'))); - 再比如根据 --dry-run 开关决定是否真实写库:
if (!$this->hasOption('dry-run')) { OrderModel::update(...); } - 所有参数最终都应在
execute()中统一处理,避免在模型或服务层重复解析
别把参数和环境变量混淆
.env 文件里的配置(如数据库地址)是全局加载的,不属于“定时任务参数”。如果你需要不同环境走不同逻辑,应通过 App::env('APP_ENV') 判断,而不是靠命令行传参来切换数据库连接。



















