美文网首页
单进程和多进程socket

单进程和多进程socket

作者: liamu | 来源:发表于2018-06-23 10:53 被阅读13次

单进程版

<?php
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

socket_bind($socket,'127.0.0.1',9091) or die("error");

socket_listen($socket,5);//开机

while(true)
{
    $client=socket_accept($socket);//有人电话进入

    //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
    $buf=socket_read($client,1024);
    echo $buf; // 客户端请求头

    $html="HTTP/1.1 200 OK".PHP_EOL
        ."Content-type:text/html;charset=utf-8".PHP_EOL.PHP_EOL;    
    if(preg_match("/sleep/i",$buf))
    {
        sleep(10);
        
        socket_write($client,$html);
        socket_write($client,"this is server.休克了10秒,模拟很繁忙的样纸");

    }
    else
    {
        socket_write($client,$html);            
        socket_write($client,"this is server");
    }
    socket_close($client);//关掉 客户端socket

}
socket_close($socket);//关机

直接在浏览器输入地址访问就行了

多进程版

<?php

$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

socket_bind($socket,'0.0.0.0',9091) or die("error");

socket_listen($socket,5);//开机

while(true)
{
    $client=socket_accept($socket);//有人电话进入
    $pid = pcntl_fork();
    //父进程和子进程都会执行下面代码
    if ($pid == -1) {
        //错误处理:创建子进程失败时返回-1.
        die('could not fork');
    } else if ($pid) {
        socket_close($client);
        //父进程会得到子进程号,所以这里是父进程执行的逻辑
        //pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
    } else {
        //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
        $buf=socket_read($client,1024);
        echo $buf;
        $html="HTTP/1.1 200 OK".PHP_EOL
            ."Content-type:text/html;charset=utf-8".PHP_EOL.PHP_EOL;

        if(preg_match("/sleep/i",$buf))
        {
            sleep(10);

            socket_write($client,"this is server.休克了10秒,模拟很繁忙的样纸");

        }
        else
        {
            socket_write($client,$html);
            socket_write($client,"this is server");
        }
        socket_close($client);//关掉 客户端socket
    }

}
socket_close($socket);//关机
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ps -ef | grep socket | wc -l

多进程版改良版

<?php

$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

socket_bind($socket,'0.0.0.0',9091) or die("error");

socket_listen($socket,5);//开机

$child=0;
while(true)
{
    $client=socket_accept($socket);//有人电话进入
    $pid = pcntl_fork();
    //父进程和子进程都会执行下面代码
    if ($pid == -1) {
        //错误处理:创建子进程失败时返回-1.
        die('could not fork');
    } else if ($pid) {
        socket_close($client);
        //父进程会得到子进程号,所以这里是父进程执行的逻辑
       //  pcntl_wait($status); //等待子进程中断,防止子进程成为僵尸进程。
        $child++;
        if($child>=3)
        {
            pcntl_wait($status);
            $child--;
        }

    } else {
        //子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
        $buf=socket_read($client,1024);
        echo $buf;

        $html="HTTP/1.1 200 OK".PHP_EOL
            ."Content-type:text/html;charset=utf-8".PHP_EOL.PHP_EOL;    
        if(preg_match("/sleep/i",$buf))
        {
            sleep(10);
            
            socket_write($client,$html);
            socket_write($client,"this is server.休克了10秒,模拟很繁忙的样纸");

        }
        else
        {
            socket_write($client,$html);
            socket_write($client,"this is server");
        }
        socket_close($client);//关掉 客户端socket
        exit;
    }


}
socket_close($socket);//关机

相关文章

网友评论

      本文标题:单进程和多进程socket

      本文链接:https://www.haomeiwen.com/subject/jfdryftx.html