首頁 >後端開發 >PHP問題 >php怎麼搭建websocket環境

php怎麼搭建websocket環境

藏色散人
藏色散人原創
2022-10-27 10:33:192498瀏覽

php搭建websocket環境的方法:1、在php.ini檔案中找到sockets擴充並將其前面的分號刪除;2、將http升級為websocket;3、配置環境變量,將PHP安裝路徑加入Path;4、在cmd輸入「php Path」即可。

php怎麼搭建websocket環境

本教學操作環境:windows7系統、PHP8.1版、Dell G3電腦。

php怎麼搭建websocket環境?

PHP建立websocket服務端

建立這個服務端需要先開啟sockets擴展,沒有開啟的話,無論如何都會報錯

#只需要在php.ini檔案中找到sockets擴充並將其前面的分號刪除能將其開啟

開啟前:

;extension=sockets

開啟後:

extension=sockets

開啟完畢,接下來我們就可以進入正題了;首先,我們了解幾個函數:

socket_create(AF_INET, SOCK_STREAM, SOL_TCP);//用于创建套接字
socket_bind( $this->master,$ip,$port);//用于绑定ip和端口
socket_listen( $this->master,1000);//用于调用connect连接的套接字和监听相关端口
socket_accept($this->master);//负责握手连接
socket_recv($socket, $buffer, 1024, 0);//从已连接的socket(客户端)接收数据
socket_write($socket,$upgrade,strlen($upgrade));//给单独客户端发送数据
send($message)//发送数据
socket_close($socket);//断开连接

很多步驟和PHP創建socket差不多,

不同主要在於socket_write使用和數據需要解、封幀,我們需要將http升級為websocket

http升級為websocket

if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$buffer,$match)){
        $responseKey=base64_encode(sha1($match[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11',true));
        $upgrade="HTTP/1.1 101 Switching Protocol\r\n".
                 "Upgrade: websocket\r\n".
                 "Connection: Upgrade\r\n".
                 "Sec-WebSocket-Accept:".$responseKey."\r\n\r\n";
                 socket_write($socket,$upgrade,strlen($upgrade));
        }

$socket是我們建立的連接,$buffer是客戶端第一次連接時發送的資料

注意:Sec-WebSocket-Key: (.*)//括號和冒號之間是要有空格的

解幀

        $len=$masks=$data=$decoded=null;
$len=ord($buffer[1]) & 127;
 
if($len === 126){
$masks=substr($buffer,4,4);
$data=substr($buffer, 8);
}else if($len === 127){
$masks=substr($buffer,10,4);
$data=substr($buffer, 14);
}else{
$masks=substr($buffer,2,4);
$data=substr($buffer, 6);
}
 
for($index = 0;$index<strlen($data);$index++){
$decoded.=$data[$index] ^ $masks[$index % 4];
}
return $decoded;

$buffer是客戶端第一次連線時發送的資料

封幀

      $len=strlen($message);
if($len<=125){
return "\x81".chr($len).$message;
}else if($len<=65535){
return "\x81".chr(126).pack("n",$len).$message;
}else{
return "\x81".chr(127).pack("xxxxN",$len).$message;
}

$message是我們需要傳送的資料

前端連線前記得執行服務端,運作方式:

在cmd輸入

php 你的服务端PHP文件路径

運行前先配置環境變數:將你的PHP安裝路徑加入Path

推薦學習:《PHP影片教學

以上是php怎麼搭建websocket環境的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn