$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)建完之后,只有一個子進程?
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);
}
$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個子進程,但每個子進程又有子進程
1、外層的while死循環(huán)純屬多余;
2、子進程部分關(guān)于select 復用部分的實現(xiàn)代碼也是有問題的;【這部分代碼是導致子進程創(chuàng)建混亂的原因根本所在】
3、另外注意信號處理機制;
我再補充兩點,具體的代碼怎么寫,自己琢磨了:
1、外層的死循環(huán)應該是寫在子進程內(nèi);
2、子進程之所以創(chuàng)建異常,是因為子進程select實現(xiàn)代碼存在問題,導致fork以克隆的副本角色在子進程內(nèi)執(zhí)行。