使用 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(); // 需要退出,避免産生僵屍程序
}
}