PHP Socket應用廣泛,可以構建將實時數據推送到瀏覽器的WebSocket、通過TCP協議獲取網絡信息等應用。以下是一份使用PHP Socket實現簡單WebSocket服務的代碼:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!$socket) { // 創建失敗處理 } if (!socket_bind($socket, '0.0.0.0', 8888)) { // 綁定端口失敗處理 } if (!socket_listen($socket)) { // 監聽失敗處理 } clients = array($socket); while (true) { $sockets = $clients; socket_select($sockets, $write = null, $except = null, null); foreach ($sockets as $sock) { if ($sock == $socket) { $clients[] = $newsock = socket_accept($socket); $header = socket_read($newsock, 1024); // 解析header,找到WebSocket Key $acceptKey = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)); $upgrade = "HTTP/1.1 101 Switching Protocols\r\n" . "Upgrade: websocket\r\n" . "Connection: Upgrade\r\n" . "Sec-WebSocket-Accept: $acceptKey\r\n\r\n"; // 往socket寫入升級協議header socket_write($newsock, $upgrade, strlen($upgrade)); } else { $bytes = socket_recv($sock, $buffer, 2048, 0); if (!empty($buffer)) { // 解析WebSocket數據幀 $data = decode($buffer); // 處理消息 handleMessage($data); } } } } function decode($buffer) { $decoded = array('payload' =>'', 'type' =>'text'); $len = ord($buffer[1]) & 127; $masks = substr($buffer, 2, 4); $data = substr($buffer, 6); for ($index = 0; $index< strlen($data); $index++) { $decoded['payload'] .= $data[$index] ^ $masks[$index % 4]; } if (ord($buffer[0]) == 8) { $decoded['type'] = 'close'; } return $decoded; }
上述代碼通過PHP Socket創建一個WebSocket服務,實現實時數據推送。在代碼中,使用了Socket相關API,如socket_create、socket_bind等。同時,還使用了socket_select函數進行多路復用,避免了使用多個線程的情況。decode函數中,解析了WebSocket數據幀,獲取到消息內容。handleMessage函數用于處理消息,具體實現需要看服務功能。
同時,PHP Socket也可以用于實現TCP協議的網絡編程。以下是一份簡單的發送數據的代碼:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); if (!$socket) { // 創建失敗處理 } if (!socket_connect($socket, '127.0.0.1', 8899)) { // 連接失敗處理 } $message = 'Hello World'; socket_write($socket, $message, strlen($message));
上述代碼創建了一個TCP Socket連接,可以將數據發送給目標服務器。在實際運用中,也可以使用服務端Socket獲取數據,例如使用socket_recv函數,獲取客戶端發送過來的數據。
綜上所述,PHP Socket是一個功能強大的網絡編程工具,使用廣泛。可以構建WebSocket推送、實現TCP協議的網絡通信等場景。掌握Socket的使用,可以為網絡編程提供強有力的支持。