天天看點

php多程序處理,php 多程序處理 http 請求

使用 stream_socket_server 監聽tcp連接配接,并實作http協定。多程序監聽套接字

代碼:

$curChildPro = 0;

$maxChildPro = 5; // 同一時刻最多 5 個程序

$index = 0;

$ppid = posix_getpid();

$socket = stream_socket_server("tcp://0.0.0.0:8081", $errno, $errstr);

while ($index<20) {

if(!$socket){

$socket = stream_socket_server("tcp://0.0.0.0:8081", $errno, $errstr);

}

$index ++;

$pid = pcntl_fork();//在此處代碼會裂開兩部分,一個父程序,一個子程序,可以共享$index變量

if ($pid == -1) {

//fork失敗

}elseif ($pid > 0) {

$curChildPro++;

//父程序會得到子程序号$pid,是以這裡是父程序執行的邏輯

//echo "-------- current process\e[1;31m" . $curChildPro . "\e[0m--------.\r\n";

//echo "\e[1;31m我是父程序{$index},我的程序id是{$ppid}.我的子程序id{$pid}\e[0m".PHP_EOL;

cli_set_process_title("我是父程序{$index},我的程序id是{$ppid}.我的子程序id{$pid}");

if ($curChildPro >= $maxChildPro) {

pcntl_wait($status);

$curChildPro--;

}

}elseif($pid==0){

$cpid = posix_getpid();

//echo "我是{$ppid}的子程序,我的程序{$index}id是{$cpid}.".PHP_EOL;

cli_set_process_title("我是{$ppid}的子程序,我的程序id是{$cpid}.");

if (!$socket) {

sleep(1);

echo "$errstr ($errno)

\n";

} else {

echo '正在監聽';

while ($conn = stream_socket_accept($socket)) {

$res="HTTP/1.1 200 ok\r\nAccept-Ranges: bytes\r\ncontent-type: text/html; charset=utf-8\r\n\r\nThe local time is ".date('Y-m-d H:i:s')."\r\n";

fwrite($conn,$res);

echo $index.'

';

fclose($conn);

}

}

exit(); // 需要退出,避免産生僵屍程序

}

}