答案:热重载需通过重启Worker进程实现。在Swoole中可结合inotify监听文件变化并调用$server->reload(),RoadRunner则通过rr serve -w启用文件监听,两者均依赖进程重启触发Composer重新加载类文件,开发环境应禁用OPCache并避免全局副作用代码,生产环境禁止热重载。

在使用 Swoole 或 RoadRunner 这类常驻内存的 PHP 长生命周期框架时,Composer 的自动加载机制虽然可以正常工作,但热重载(即代码修改后自动生效)会遇到问题。这是因为进程启动后,类已被加载到内存中,不会自动重新读取新代码。以下是解决方案和最佳实践。
Composer 通过 ClassLoader 实现 PSR-4/PSR-0 的自动加载。但在 Swoole/RoadRunner 中,主进程只执行一次 require autoload.php,后续请求复用已加载的类。如果此时文件被修改:
因此,仅靠 Composer 无法实现热重载。
Swoole 提供了进程管理能力,可结合 inotify 或文件监听实现重启 Worker 进程。
reload_async 和 max_wait_time
inotify 扩展监听文件变化,触发 $server->reload()
$server->set([
'enable_coroutine' => true,
'worker_num' => 2,
'reload_async' => true,
'max_wait_time' => 3
]);
<p>if (extension_loaded('inotify')) {
$watcher = inotify_init();
// 添加监听目录...
swoole_event_add($watcher, function () use ($server) {
$server->reload(); // 触发平滑重启
});
}</p>注意:每次 reload 会重启 Worker 进程,重新执行 Composer 加载逻辑,从而加载最新代码。
RoadRunner 官方提供了 rr 命令行工具支持热重载:
inotify 或 fsnotify
rr serve -d -w=1 启动,其中 -w 表示监听文件更改.rr.yaml 中的 watcher 插件:
watcher:
enabled: true
interval: 1s
paths:
- "."
exclude_paths:
- "vendor"
- "tests"
当文件变更时,RoadRunner 会自动重启 PHP Worker,重新加载 Composer 自动加载器,获取最新类文件。
无论使用哪种框架,以下做法有助于提升开发体验:
opcache.enable=0
基本上就这些。核心思路是:Composer 负责加载,而热重载由进程管理器通过重启 Worker 实现。只要进程重启,Composer 就会重新注册自动加载,读取最新代码。
以上就是如何在Swoole或RoadRunner项目中使用Composer并处理热重载?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号