inotify 是独立 PHP 扩展,需单独安装并手动集成,Swoole 本身不包含文件监听逻辑;Linux 下安装 inotify 扩展后配合脚本或框架 watcher 实现热重载,macOS 和 Windows 需换用 fswatch 或轮询方案。

不能在 Swoole 安装阶段启用 inotify 自动重载——inotify 是独立的 PHP 扩展,和 Swoole 无编译依赖关系,必须单独安装并手动集成。
inotify 扩展不是 Swoole 的子功能
很多人误以为 pecl install swoole 会顺带装好文件监听能力,实际完全不会。Swoole 本身不包含任何文件系统监听逻辑,inotify 是 Linux 内核提供的系统接口,PHP 需通过 inotify 扩展暴露为函数(如 inotify_init()、inotify_add_watch()),再由业务代码或工具调用。
常见错误现象:inotify_init(): No such file or directory 或直接报函数未定义,本质是没装扩展,而非 Swoole 配置不对。
- Linux 下需先装系统包:
inotify-tools(仅用于命令行脚本) + PHPinotify扩展(用于 PHP 内部监听) - macOS 不支持
inotify,必须换用fswatch+ 用户态轮询,性能和精度都更低 - Windows WSL 可用
inotify,但原生 Windows 不支持,别指望php -m | grep inotify能成功
如何正确安装 inotify PHP 扩展
以 PHP 8.1 为例(路径按你实际环境替换):
cd /tmp wget https://pecl.php.net/get/inotify-3.0.0.tgz tar -xzf inotify-3.0.0.tgz cd inotify-3.0.0 /usr/bin/phpize ./configure --with-php-config=/usr/bin/php-config make && sudo make install
然后在 php.ini 末尾加一行:extension=inotify.so,再执行 php -m | grep inotify 确认生效。
关键检查点:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 确保
phpize和php-config来自同一 PHP 版本(混用会导致扩展加载失败) - CentOS/RHEL 需额外装
kernel-devel和gcc,否则make报错 - Docker 中若用
alpine镜像,inotify扩展不可用,只能退回到fswatch+ shell 脚本方案
inotify 与 Swoole reload 的协作方式
装完 inotify 扩展,不代表热重载就自动工作了。它只是提供了监听能力,真正触发重启还得靠你自己写逻辑:要么在 PHP 进程里用 inotify_init() 做长连接监听(适合 EasySwoole、Hyperf 等框架内置 watcher),要么用外部 shell 脚本监听 + kill -USR1 发信号(更轻量、更可控)。
典型陷阱:
- 在
onWorkerStart里调inotify_add_watch()—— 每个 worker 都起一套监听,资源浪费且事件重复触发 - 监听整个
vendor/目录 —— Composer 更新瞬间触发几百次 reload,服务雪崩 - 没加
sleep 0.1就发SIGUSR1—— 文件可能还在写入中,导致语法错误后 worker 启动失败,陷入反复崩溃循环 - 忽略
opcache.enable=0或opcache.revalidate_freq=0—— 即使 worker 重启,opcode 还是旧的,代码照样不生效
替代方案:用 swoole-watcher 更省事
如果你不想手写监听逻辑,swoole-watcher 是目前最成熟的 CLI 工具:
composer global require hyperf/watcher # 启动时指定监听目录和信号 hyperf-watcher --watch-dir=app --watch-dir=config --signal=USR1 start.php
它内部自动判断平台(Linux 用 inotify,macOS 用 fswatch),还做了文件变更去抖、进程保活、错误抑制。比自己拼 shell 脚本稳定得多。
但注意:它只适用于开发环境。生产环境严禁开启任何形式的自动 reload,必须走发布流程 + 手动 $server->reload() 或滚动更新。
真正容易被忽略的是:inotify 监听的是“文件内容变更”,不是“文件保存动作”。IDE 编辑器后台自动备份(如 .php~)、Git 切分支、甚至 Vim 交换文件(.swp)都可能触发误 reload。过滤规则必须写严,否则你会在改注释时突然发现服务卡了两秒——因为 inotifywait 正在等那个还没写完的临时文件。

















