进程,线程 IO复用,协程都是处理完成并发的方式
socket分为 三步 服务器监听,客户端请求,连接确认,
每次连接都由当前进程来处理,可以通过IO复用来解决这个问题,
这次通过进程来完成并发请求,但是这种方式开销大,消耗较多,频繁的创建和销毁也是耗时
线程并发 IO复用 等下次在贴代码
进程并发代码 服务端代码
<?php
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die("error:".socket_strerror(socket_last_error()));
socket_bind($socket,"192.168.33.1","8000") or die("error:".socket_strerror(socket_last_error()));
socket_set_option($socket, SOL_SOCKET , SO_REUSEADDR , 1);#可以重复使用端口号
socket_listen($socket,5);
while(true){
print("******等待新客户端的到来*******\r\n");
$clien = socket_accept($socket) or die("error:".socket_strerror(socket_last_error()));
$pid = pcntl_fork();
#posix_setsid();
if ($pid == -1) {
die('fork failed');
} else if ($pid == 0) {
hanld_seesion($clien);
} else {
#pcntl_wait($status);
}
} function hanld_seesion($clien){
socket_getpeername($clien,$ip,$port);
$id = posix_getpid();
print("进程ID:$id == 客户端:".$ip.":".$port."已连接\r\n");
while(true){
$data = socket_read($clien,1024);
if(mb_strlen($data) == 0)
{
print("进程ID:$id == 客户端:".$ip.":".$port."断开连接\r\n");
socket_close($clien);
exit();
}
print($ip.":".$port.">>:".$data."\r\n");
}
}
客户端代码
<?php
$socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die("error:".socket_strerror(socket_last_error()));
$msg = "Ping!";
$len = strlen($msg);
$server = socket_connect($socket,'192.168.33.1', 8000);
socket_write($socket, $msg);
sleep(30);
socket_close($socket);