Appearance
概述
在宝塔 Supervisor 或 Linux systemd 中添加 php think swoole 守护进程后,若进程状态频繁显示 FATAL、BACKOFF 或点击启动后立即停止,请按照本文档进行逐步诊断和修复。
快速定位:前台命令行执行排查
不要直接在后台反复重启,请通过 SSH 连接服务器,切换到站点根目录并以 www 用户身份前台运行启动命令:
bash
cd /www/wwwroot/你的项目目录
sudo -u www php think swoole观察终端输出的错误信息,常见错误类型及解决方案如下:
常见错误与解决方案
提示禁用函数未删除(如 proc_open、pcntl_signal)
- 错误表现:
Function proc_open() is disabled for security reasons或Call to undefined function pcntl_signal() - 解决办法:
- 宝塔面板 -> 【软件商店】 -> 找到对应 PHP 版本(如 PHP-8.0) -> 【设置】 -> 【禁用函数】。
- 找到
proc_open、pcntl_signal、pcntl_alarm等函数并删除禁用。 - 重载 PHP 配置。
端口被占用(Address already in use)
- 错误表现:
bind(127.0.0.1:20697) failed: Address already in use - 解决办法:
- 查询占用该端口的进程:bash
lsof -i :20697 - 若为历史残留的 Swoole 孤儿进程,执行强制清理:bash
pkill -9 -f "php think swoole" - 重新在 Supervisor 中启动守护进程。
- 查询占用该端口的进程:
PHP CLI 版本与扩展不匹配
- 错误表现:提示扩展未安装(如
swoole、redis、fileinfo),但宝塔面板中已安装。 - 根本原因:Linux 默认命令行环境变量中的
php(如/usr/bin/php)指向了系统自带的低版本 PHP 或未安装扩展的 PHP。 - 解决办法:
- 执行
php -v查看命令行默认版本。 - 在宝塔面板【网站】 -> 【PHP CLI 版本】中将命令行 PHP 统一切换为 PHP-8.0。
- 或在 Supervisor 的启动命令中使用绝对路径:bash
/www/server/php/80/bin/php think swoole
- 执行
目录权限不足
- 错误表现:
Permission denied,无法写入runtime/目录或日志。 - 解决办法:bash
chown -R www:www /www/wwwroot/你的项目目录 chmod -R 755 /www/wwwroot/你的项目目录 chmod -R 777 /www/wwwroot/你的项目目录/runtime
数据库或 Redis 连接失败
- 错误表现:
PDOException: SQLSTATE[HY000] [2002] Connection refused或Redis connection failed - 解决办法:
- 检查 MySQL 和 Redis 服务是否正常运行。
- 检查项目根目录下
.env文件中的数据库用户名、密码、端口与 Redis 密码是否配置正确。