TL;DR
PHP实现守护进程可以通过 pcntl 与 posix 扩展实现。
编程中需要注意的地方有:
- 通过二次
pcntl_fork()以及posix_setsid让主进程脱离终端 - 通过
pcntl_signal()忽略或者处理SIGHUP信号 - 多进程程序需要通过二次
pcntl_fork()或者pcntl_signal()忽略SIGCHLD信号防止子进程变成 Zombie 进程 - 通过
umask()设定文件权限掩码,防止继承文件权限而来的权限影响功能 - 将运行进程的
STDIN/STDOUT/STDERR重定向到/dev/null或者其他流上
如果要做的更好,还需要注意:
- 如果通过 root 启动,运行时更换到低权限用户身份
- 及时
chdir()防止操作错误路径 - 多进程程序考虑定时重启,防止内存泄露