Socket
Socket並不是一個協議,本質上說Socket是對 TCP/IP 協議的封裝,它是一組接口,在設計模式中,Socket 其實就是一個門面(facade)模式,它把複雜的 TCP/IP 協議族隱藏在 Socket 接口後面,對用戶來說,一組簡單的接口就是全部,讓 Socket 去組織數據,以符合指定的協議。
php Socket
雖然PHP的強項是處理文本,一般用來寫網頁和http接口,但是官方依然提供了Socket擴展,編譯PHP時在配置中添加–enable-sockets 配置項來啓用。關於TCP客戶端和服務端之間的通信過程如下圖所示
服務端代碼
vim Server.php
<?php
set_time_limit(0);
$ip = '127.0.0.1';
$port = 8887;
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, $ip, $port);
socket_listen($sock, 4);
echo "Server Started, Listen On $ip:$port\n";
$accept = socket_accept($sock);
socket_write($accept, "Hello World!\n", 8192);
$buf = socket_read($accept, 8192);
echo "Receive Msg: " . $buf . "\n"; socket_close($sock);
開啓服務 php Server.php
使用curl訪問服務 curl 127.0.0.1:8887
使用telnet訪問服務 telnet 127.0.0.1 8887
客戶端代碼
<?php
set_time_limit(0);
$port = 8887;
$ip = '127.0.0.1';
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
echo "Connecting $ip:$port\n";
socket_connect($sock, $ip, $port);
$input = "Hello World Socket";
socket_write($sock, $input, strlen($input));
$out = socket_read($sock, 8192);
echo "Receive Msg: $out\n";
socket_close($sock);
總結
簡單使用php socket, 深入研究可以使用成熟框架workman和swoole