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()
防止操作错误路径 - 多进程程序考虑定时重启,防止内存泄露