php socket多進程簡單服務器(一)

進程,線程  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);

    

相關文章
相關標籤/搜索