监听文件变化自动重启 Hyperf

前提条件

在使用此 watch 脚本前,请确保您的开发环境满足以下要求:

1. PHP 版本要求

  • PHP 7.3 或更高版本(推荐 PHP 8.0+)
  • 需要启用以下扩展:
    • pcntl:用于进程控制,这是脚本监听文件变化的核心依赖
    • posix:用于进程信号处理
    • sockets:Hyperf 框架运行所需

2. Hyperf 框架版本

  • Hyperf 2.0 或更高版本(兼容 Hyperf 3.x)
  • 确保项目已正确安装并配置

3. 操作系统兼容性

  • Linux/macOS:完全支持(推荐开发环境)
  • Windows
    • 需要 WSL(Windows Subsystem for Linux)环境
    • 或使用 Docker 容器运行
    • 原生 Windows 环境可能因信号处理差异存在兼容性问题

4. 文件系统权限

  • 对项目根目录有读取和执行权限
  • runtime 目录有写入权限(用于存储 PID 文件)
  • 对监听目录有读取权限

5. 环境检查命令

在安装前,可以运行以下命令检查环境是否满足要求:

# 检查 PHP 版本
php -v

# 检查必要扩展
php -m | grep -E "pcntl|posix|sockets"

# 检查 Hyperf 项目状态
php bin/hyperf.php

如果缺少必要扩展,请根据您的系统安装相应扩展:

# Ubuntu/Debian
sudo apt install php-pcntl php-posix php-sockets

# CentOS/RHEL
sudo yum install php-pcntl php-posix php-sockets

# macOS (Homebrew)
brew install php@8.2

6. 其他注意事项

  • 确保终端支持 ANSI 颜色代码(用于控制台彩色输出)
  • 建议在开发环境中使用,生产环境请勿启用文件监听
  • 如果使用 Docker,请确保容器内已安装上述 PHP 扩展

提示:如果环境检查通过,即可继续下面的安装步骤。如有问题,请先解决环境依赖再继续。

安装

根目录下载

wget -O watch https://gitee.com/hanicc/hyperf-watch/raw/master/watch

启动监听

php watch

启动监听并删除代理类缓存(./runtime/container)

php watch -c

退出监听:

Control + C

默认配置(打开 watch 文件,可自行修改):

# PHP Bin File PHP 程序所在路径(默认自动获取)
const PHP_BIN_FILE = 'which php';
# Watch Dir 监听目录(默认监听脚本所在的根目录)
const WATCH_DIR = __DIR__ . '/';
# Watch Ext 监听扩展名(多个可用英文逗号分隔)
const WATCH_EXT = 'php,env';
# Exclude Dir 排除目录(不监听的目录,数组形式)
const EXCLUDE_DIR = ['vendor', 'runtime', 'public'];
# Entry Point File 入口文件
const ENTRY_POINT_FILE = __DIR__ . '/bin/hyperf.php';
# Start Command 启动命令
const START_COMMAND = [ENTRY_POINT_FILE, 'start'];
# PID File Path PID 文件路径
const PID_FILE_PATH = __DIR__ . '/runtime/hyperf.pid';
# Scan Interval 扫描间隔(毫秒,默认2000)
const SCAN_INTERVAL = 2000;
# Console Color 控制台颜色
const CONSOLE_COLOR_DEFAULT = "\033[0m";
const CONSOLE_COLOR_RED = "\033[0;31m";
const CONSOLE_COLOR_GREEN = "\033[0;32m";
const CONSOLE_COLOR_YELLOW = "\033[0;33m";
const CONSOLE_COLOR_BLUE = "\033[0;34m";

常见问题与排查

1. 监听不生效怎么办?

如果启动监听后,修改文件没有触发 Hyperf 重启,请按以下步骤排查:

  1. 检查监听目录和扩展名

    • 确认修改的文件在 WATCH_DIR 指定的目录下
    • 确认文件扩展名在 WATCH_EXT 列表中(默认监听 .php.env 文件)
  2. 检查排除目录

    • 确保修改的文件不在 EXCLUDE_DIR 排除的目录中(默认排除 vendorruntimepublic
  3. 检查文件权限

    • 确保 watch 脚本有读取监听目录的权限
    • 确保 PHP 进程有执行权限
  4. 检查扫描间隔

    • 默认扫描间隔为 2000 毫秒(2 秒),如果修改后立即查看可能还未触发
    • 可在配置中调整 SCAN_INTERVAL 值,但不宜设置过小以免消耗过多系统资源
  5. 查看控制台输出

    • 启动监听时添加 -v 参数查看详细日志:php watch -v
    • 观察是否有文件变更检测的日志输出

2. 如何修改监听目录或扩展名?

watch 脚本的配置存储在脚本文件本身,需要直接编辑 watch 文件进行修改:

  1. 打开配置文件

    vim watch
    

    或使用其他文本编辑器打开

  2. 修改监听目录
    找到 const WATCH_DIR = __DIR__ . '/'; 这一行,可以修改为:

    const WATCH_DIR = __DIR__ . '/app/';  // 只监听 app 目录
    

    const WATCH_DIR = '/path/to/your/project/';  // 指定绝对路径
    
  3. 修改监听扩展名
    找到 const WATCH_EXT = 'php,env'; 这一行,可以修改为:

    const WATCH_EXT = 'php,env,json,yaml';  // 增加 json 和 yaml 文件
    

    const WATCH_EXT = 'php';  // 只监听 php 文件
    
  4. 保存并重启监听

    • Control + C 退出当前监听
    • 重新执行 php watch 启动监听
    • 修改会立即生效,无需重新下载脚本
  5. 其他可配置项

    • EXCLUDE_DIR: 排除不需要监听的目录
    • SCAN_INTERVAL: 调整文件扫描频率(单位:毫秒)
    • PHP_BIN_FILE: 指定 PHP 可执行文件路径

注意:修改配置后需要重启监听进程才能生效。如果修改后出现问题,可以重新下载原始脚本恢复默认配置。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐