触发inotify事件时如何运行PHP代码 监听文件修改实现页面自动重载
实现方案
首先说明:你当前的写法存在两个核心问题:一是inotify_read是阻塞函数,页面配置的2秒自动刷新完全无法和inotify逻辑配合;二是Web请求下的PHP脚本默认有最大执行时长限制,无法长期运行监听逻辑。下面给两种适配不同场景的可行方案:
1. CLI 常驻监听方案(推荐,适合重载框架的服务端逻辑)
服务端的文件监听逻辑建议写CLI脚本长期运行,不受Web请求的时长限制,稳定性更高。
<?php // 脚本执行方式:命令行运行 php watch_log.php $inf = inotify_init(); // 绑定log.txt的修改事件监听 $watch = inotify_add_watch($inf, './log.txt', IN_MODIFY); // 死循环实现常驻监听 while (true) { // 阻塞等待事件触发 $events = inotify_read($inf); if (!empty($events)) { foreach ($events as $event) { // 匹配修改事件 if ($event['mask'] & IN_MODIFY) { // 此处编写你需要触发的自定义代码,比如框架重载逻辑 echo "log.txt 已更新,执行重载逻辑\n"; // 示例:读取最新日志内容 $logContent = file_get_contents('./log.txt'); echo "最新日志:\n".$logContent."\n"; } } } } // 以下是清理逻辑,常驻脚本默认不会执行到此处,停止脚本按Ctrl+C即可 inotify_rm_watch($inf, $watch); fclose($inf); ?>
注意事项:
- 执行前先确认PHP已安装inotify扩展,可通过
php -m | grep inotify命令检查 - 后台挂起脚本可使用命令:
nohup php watch_log.php &
2. Web端实时展示方案(适合前端展示日志场景)
如果你需要在浏览器实时展示日志内容,也可以调整原有Web代码,但仅推荐本地调试使用,生产环境会大量占用PHP-FPM进程,稳定性不足。
<html style='background-color:#202020;'> <head> <meta charset="UTF-8"> <style>body {color: #FFFFFF;}</style> </head> <body id="chat"> <?php // 首次加载输出初始日志 $log = file_get_contents('./log.txt'); echo nl2br(htmlspecialchars($log))."<hr>"; $inf = inotify_init(); $watch = inotify_add_watch($inf, './log.txt', IN_MODIFY); // 解除脚本执行时长限制 set_time_limit(0); // 关闭输出缓冲,实时推送内容到浏览器 ob_implicit_flush(true); ob_end_flush(); while (true) { $events = inotify_read($inf); if (!empty($events)) { foreach ($events as $event) { if ($event['mask'] & IN_MODIFY) { echo "检测到日志更新:<br>"; $newLog = file_get_contents('./log.txt'); echo nl2br(htmlspecialchars($newLog))."<hr>"; } } } } inotify_rm_watch($inf, $watch); fclose($inf); ?> </body> </html>
内容的提问来源于stack exchange,提问作者Adi B.
相关产品推荐
相关产品推荐

