進程,線程 IO複用,協程都是處理完成併發的方式php
socket分爲 三步 服務器監聽,客戶端請求,鏈接確認,服務器
每次鏈接都由當前進程來處理,能夠經過IO複用來解決這個問題,併發
此次經過進程來完成併發請求,可是這種方式開銷大,消耗較多,頻繁的建立和銷燬也是耗時socket
線程併發 IO複用 等下次在貼代碼spa
進程併發代碼 服務端代碼線程
1 <?php 2 $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die("error:".socket_strerror(socket_last_error())); 3 socket_bind($socket,"192.168.33.1","8000") or die("error:".socket_strerror(socket_last_error())); 4 socket_set_option($socket, SOL_SOCKET , SO_REUSEADDR , 1);#能夠重複使用端口號 5 socket_listen($socket,5); 6 while(true){ 7 print("******等待新客戶端的到來*******\r\n"); 8 $clien = socket_accept($socket) or die("error:".socket_strerror(socket_last_error())); 9 $pid = pcntl_fork(); 10 #posix_setsid(); 11 if ($pid == -1) { 12 die('fork failed'); 13 } else if ($pid == 0) { 14 hanld_seesion($clien); 15 } else { 16 #pcntl_wait($status); 17 } 18 } 19 20 function hanld_seesion($clien){ 21 socket_getpeername($clien,$ip,$port); 22 $id = posix_getpid(); 23 print("進程ID:$id == 客戶端:".$ip.":".$port."已鏈接\r\n"); 24 while(true){ 25 $data = socket_read($clien,1024); 26 if(mb_strlen($data) == 0) 27 { 28 print("進程ID:$id == 客戶端:".$ip.":".$port."斷開鏈接\r\n"); 29 socket_close($clien); 30 exit(); 31 } 32 print($ip.":".$port.">>:".$data."\r\n"); 33 } 34 }
客戶端代碼3d
1 <?php 2 $socket = socket_create(AF_INET,SOCK_STREAM,SOL_TCP) or die("error:".socket_strerror(socket_last_error())); 3 $msg = "Ping!"; 4 $len = strlen($msg); 5 $server = socket_connect($socket,'192.168.33.1', 8000); 6 socket_write($socket, $msg); 7 sleep(30); 8 socket_close($socket);