国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

如何創(chuàng)建多個子進程

wuxian
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_nonblock($socket);
socket_bind($socket,'0.0.0.0',8666) or die('error');
socket_listen($socket,10);
$sockets = ;
$sockets = $socket;
while(true) {
    for ($i = 0; $i < 5; $i++) {
        $pid = pcntl_fork();
        echo $pid;
        if ($pid == -1) {
            die('could not fork');
        } else if ($pid) {
            pcntl_wait($status); //等待上一個進程結(jié)束
        } else {
            $clients = $sockets;
            socket_select($clients, $write, $except, NULL);
            foreach ($clients as $n=>$v) {
                if ($v == $socket) {
                    $client = socket_accept($socket);
                    $clients = $client;
                }else{
                $buf = socket_read($v, 1024);

                    if (preg_match('/sleep/i', $buf)) {
                        $html = 'HTTP/1.1 200 OK' . PHP_EOL
                            . 'Content-Type: text/html;charset=utf-8' . PHP_EOL . PHP_EOL;
                        socket_write($v, $html);
                        socket_write($v, "this is server,45434");
                    } else {
                        socket_write($v, "this is server");
                    }
                    unset($clients);
                    socket_close($v);
                    exit;//關(guān)閉子進程

}
            }
        }
    }
}

socket_close($socket);?

這樣創(chuàng)建完之后,只有一個子進程?

4219 3 0
3個回答

phpcreeper

1、題示的寫法,在創(chuàng)建了第一個子進程后,因為pcntl_wait系統(tǒng)調(diào)用會阻塞主進程。
2、進程部分參考代碼:

<?php
for ($i = 0; $i < 5; $i++) 
{
    $pid = pcntl_fork();
    echo $pid . PHP_EOL;
    if($pid < 0) {
        die('could not fork');
    }elseif($pid > 0) {
    }else{
        while(1){sleep(1);}
        exit;
    }
}

while(1)
{
    pcntl_wait($status);
}
  • 暫無評論
wuxian

感謝大神解答,但有疑惑,pcntl_wait($status); 我的寫法是寫在主進程執(zhí)行的代碼,也會阻塞子進程嗎,

  • phpcreeper 2019-03-20

    寫在主程會阻塞主程,不會阻塞子進程。

wuxian

$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_set_nonblock($socket);
socket_bind($socket,'0.0.0.0',8666) or die('error');
socket_listen($socket,10);
$sockets = $socket;
while(true) {
for ($i = 0; $i < 5; $i++) {
$pid = pcntl_fork();
echo $pid;
if ($pid == -1) {
die('could not fork');
} else if ($pid) {

    } else {
        $clients = $sockets;
        socket_select($clients, $write, $except, NULL);
        foreach ($clients as $n=>$v) {
            if ($v == $socket) {
                $client = socket_accept($socket);
                $clients = $client;
            }else{
                $buf = socket_read($v, 1024);

                if (preg_match('/sleep/i', $buf)) {
                    $html = 'HTTP/1.1 200 OK' . PHP_EOL
                        . 'Content-Type: text/html;charset=utf-8' . PHP_EOL . PHP_EOL;
                    socket_write($v, $html);
                    socket_write($v, "this is server,45434");
                } else {
                    socket_write($v, "this is server");
                }
                unset($clients);
                socket_close($v);
                exit;//關(guān)閉子進程

            }
        }
    }
}
while(1){
    pcntl_wait($status); //等待上一個進程結(jié)束
}

}

socket_close($socket);
?這樣改寫之后,創(chuàng)建了不只5個進程 ,是5個子進程,但每個子進程又有子進程

  • phpcreeper 2019-03-20

    1、外層的while死循環(huán)純屬多余;
    2、子進程部分關(guān)于select 復用部分的實現(xiàn)代碼也是有問題的;【這部分代碼是導致子進程創(chuàng)建混亂的原因根本所在】
    3、另外注意信號處理機制;

  • phpcreeper 2019-03-20

    我再補充兩點,具體的代碼怎么寫,自己琢磨了:
    1、外層的死循環(huán)應該是寫在子進程內(nèi);
    2、子進程之所以創(chuàng)建異常,是因為子進程select實現(xiàn)代碼存在問題,導致fork以克隆的副本角色在子進程內(nèi)執(zhí)行。

  • wuxian 2019-03-21

    謝謝大神指點

年代過于久遠,無法發(fā)表回答
??