PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。
PHP进程
新建一个pcntl.php 文件
1 | $pid = pcntl_fork(); |
查看进程情况
1 | ps -ef|grep pcntl |
1 | root 16931 4875 1 08:55 pts/1 00:00:00 php pcntl.php |
孤儿进程
1 | //模拟 父进程先退出,子进程变成孤儿进程,被init1 收养 |
僵尸进程
1 | //模拟 子进程先退出,子进程变成僵尸进程 |
PHP程序守护进程化
使用 supervisor
安装
1 | sudo apt-get install supervisor |
命令
Supervisor 有两个可执行程序 – supervisord 和 supervisorctl:
supervisord
是后台管理服务器, 用来依据配置文件的策略管理后台守护进程, 它会随系统自动启动supervisorctl
用于管理员向后台管理程序发送 启动/重启/停止 等指令;
它们之间的关系就相当于 Apache 的 httpd 和 apachectl.
配置文件
主配置文件 的路径位于 /etc/supervisor/supervisord.conf, 主配置文件中的末尾两行文本:
1 | while (true) |
1 | [include] |
运行
注意: 每次 修改主配置文件 或 增改子配置文件 都需要执行 supervisorctl update 使新配置生效
1 | # 控制所有进程 |
nohup
1 | nohup php test.php > log.txt & |
单独执行 php test.php,当按下ctrl+c时就会中断程序执行,会kill当前进程以及子进程。
php test.php &,这样执行程序虽然也是转为后台运行,实际上是依赖终端的,当用户退出终端时进程就会被杀掉
##
1 | function daemonize() |
改进版:
1 | Class Daemon{ |
PHP程序需要转为后台运行时,只需要调用一次封装好的函数daemonize()即可
后台建立简单服务器
1 | /* 设置不显示任何错误 */ |
测试
1 | telnet 127.0.0.1 10000 |