nginx的master管理进程与worker工作进程。(上图)
我们在nginx-2的基础上,用php的pcntl多进程控制模块来演示原理,workman源码中也有pcntl的内容,此篇简单看一下即可。
注意
- pcntl在php手册可查阅
- 它只能在linux上使用
- 实际开发中进程建议使用swoole
pcntl 是php进程控制的一个扩展。百度pcntl,
重点 点击查看 pcntl_fork 函数,fork 翻译为分叉,我们常说fork一个子进程 即创建一个子进程。详细请看 手册 。
往下翻有一个范例
<?php
$pid = pcntl_fork();
//父进程和子进程都会执行下面代码
if ($pid == -1) {
//错误处理:创建子进程失败时返回-1.
die('could not fork');
} else if ($pid) {
//父进程会得到子进程号,所以这里是父进程执行的逻辑
pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
} else {
//子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
}
?>
那么把这一段代码应用到《nginx-2》的代码中就实现了多进程处理http请求的方式。
接下来把红框内的部分,放进子进程中,每个http请求用一个子进程来处理。
这样每个http请求都有单独的一个子进程来处理,对比单进程,提高了效率。
附:linux安装pcntl扩展
如果要使用此扩展,需要在编译安装php时指定安装此模块,而通常并没有指定该模块。所以可以选择重新编译安装php,或者下载对应php版本的pcntl扩展,单独安装此模块。这里选择后者。
- 下载对应服务器php版本的php源码包 官网 http://php.net/releases/
打开后为各个版本的php下载压缩包
- 查看php版本
php -v
//7.2.8
-
ctrl + F 查找7.2.8
-
点击tar.gz下载
-
传输至linux,解压,到ext目录查找pcntl
tar -zxvf php-7.2.8.tar.gz
cd php-7.2.8/ext
- 编译安装
cd pcntl
phpize
./configure --with-php-config=/www/server/php/72/bin/php-config
make && make install
找到服务器的php.ini目录
cd /www/server/php/72/etc
echo "extension=pcntl.so" >> /etc/php.ini