上节课我们讲到如何使用多进程方式来同时处理不同的客户端请求,但是问题也来了:子进程会不断新增。我们该怎么控制这些子进程呢?
1.子进程不断新增问题
我们用浏览器访问http://127.0.0.1:9090, 如果不断的刷新。那么子进程会不断新增,在终端用ps -ef |grep server.php |grep -v grep
命令查看。
注:server.php就是我们socket服务端程序。
<?php
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_bind($socket,'127.0.0.1',9090) or die('error');
socket_listen($socket,5);
$child = 0; //初始化子进程数
while(true){
$client = socket_accept($socket);
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
socket_close($client);
$child++;
if($child >= 3){ //假设最大进程数为3
pcntl_wait($status); //等待上一个进程结束
$child--;
}
} else {
$buf = socket_read($client,1024);
echo $buf;
if(preg_match('/sleep/i',$buf)){
sleep(10);
$html = 'HTTP/1.1 200 OK'.PHP_EOL
.'Content-Type: text/html;charset=utf-8'.PHP_EOL.PHP_EOL;
socket_write($client,$html);
socket_write($client,"this is server,休克了10秒,模拟很繁忙的样子");
}else{
socket_write($client,"this is server");
}
socket_close($client);
exit;//关闭子进程
}
}
socket_close($socket);
以上代码我们设置了最大子进程数为3,当大于3就要pcntl_wait
等待上一个进程结束。
并且在执行子进程逻辑的最后不要忘记关闭exit
。
这时如果我们不断的请求http://127.0.0.1:9090/ ,但有3个进程的时候就会再次等待了。