Socket学习 - php+Socket多进程处理速学:防止子进程无限增加

上节课我们讲到如何使用多进程方式来同时处理不同的客户端请求,但是问题也来了:子进程会不断新增。我们该怎么控制这些子进程呢?

1.子进程不断新增问题
我们用浏览器访问http://127.0.0.1:9090, 如果不断的刷新。那么子进程会不断新增,在终端用ps -ef |grep server.php |grep -v grep 命令查看。
注:server.php就是我们socket服务端程序。



$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个进程的时候就会再次等待了。

你可能感兴趣的:(PHP)