在宝塔面板部署hyperf多进程定时任务需确保php环境含swoole≥4.8.0和pcntl扩展,安装hyperf/crontab组件并启用调度进程,通过设置$singleton=true和redis分布式锁防重复执行,最后用宝塔计划任务守护启动脚本。

在宝塔面板上部署 Hyperf 多进程定时任务,核心是让 hyperf/crontab 组件在多 Worker 进程环境下安全、稳定、不重复地执行任务。这不是简单加个计划任务,而是要结合 Hyperf 自身的协程调度机制与宝塔的运行环境做适配。
确认 PHP 环境与扩展已就绪
Hyperf 依赖 Swoole 和 pcntl 扩展,缺一不可:
- 在宝塔「软件商店」安装对应 PHP 版本(推荐 PHP 8.1+),安装时务必勾选 pcntl 和 openssl,Swoole 扩展需单独启用(宝塔会自动识别已编译的 Swoole)
- 进入终端,执行
/www/server/php/81/bin/php -m | grep -E "(swoole|pcntl)",确认两模块均在输出列表中 - 若提示
Class 'Swoole\Coroutine' not found,说明 Swoole 未启用或版本过低(Hyperf 要求 Swoole ≥ 4.8.0)
安装并启用 hyperf/crontab 组件
定时任务不是靠系统 crond 驱动,而是由 Hyperf 主服务内置的协程调度器管理:
- 进入项目根目录,执行:
composer require hyperf/crontab - 确保
config/autoload/crontab.php存在且'enable' => true - 在
config/autoload/processes.php中注册调度进程:Hyperf\Crontab\Process\CrontabDispatcherProcess::class - 若使用注解方式定义任务,类需放在
app/Crontab/下,继承AbstractCrontab并标注@Crontab
配置多进程安全执行(防重复关键)
Hyperf 默认启动多个 Worker 进程,若不控制,每个进程都会尝试执行同一任务 —— 必须启用单例 + 分布式锁:
- 在任务类中设置:
public array $singleton = true;(保证同一时刻仅一个 Worker 执行) - 配合 Redis 锁(需已配置 Redis 客户端):
public array $mutex = ['type' => 'redis']; - 确保
config/autoload/cache.php和redis.php已正确配置,且 Redis 服务可连通 - 避免用
file类型锁,多容器或多服务器部署时失效
通过宝塔启动并守护 Hyperf 服务
不能依赖手动命令,要用宝塔「计划任务」实现开机自启和异常拉起:
- 编写启动脚本
/www/wwwroot/your-site.com/start.sh,内容如下:
/www/server/php/81/bin/php /www/wwwroot/your-site.com/bin/hyperf.php start > /dev/null 2>&1 &
- 宝塔「计划任务」→ 添加 Shell 脚本 → 周期设为「重启时」→ 勾选「禁止重复执行」
- 脚本内容填:
bash /www/wwwroot/your-site.com/start.sh - 保存后点「执行」测试,并立即执行
ps aux | grep hyperf查看进程是否存活 - 注意:不要用
php start.php start -d这类 ThinkPHP 风格命令,Hyperf 启动入口是bin/hyperf.php










