亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

PHP實(shí)現(xiàn)web socket長(zhǎng)鏈接流程詳解

 更新時(shí)間:2023年03月25日 11:29:13   作者:深斗士  
這篇文章主要介紹了PHP實(shí)現(xiàn)web socket長(zhǎng)鏈接流程,了解內(nèi)部原理是為了幫助我們做擴(kuò)展,同時(shí)也是驗(yàn)證了一個(gè)人的學(xué)習(xí)能力,如果你想讓自己的職業(yè)道路更上一層樓,這些底層的東西你是必須要會(huì)的

簡(jiǎn)介

目前PHP實(shí)現(xiàn)web socket 都是使用框架集成來(lái)實(shí)現(xiàn),比如hyperf,swoft,或者是安裝swoole 擴(kuò)展來(lái)實(shí)現(xiàn)websocket,那么有沒(méi)有PHP本身就能夠?qū)崿F(xiàn)的呢,答案當(dāng)然有,Let’s go.

函數(shù)介紹

服務(wù)端

stream_socket_server — Create an Internet or Unix domain server socket

可以幫我創(chuàng)建網(wǎng)絡(luò)鏈接具柄,參數(shù)如下

stream_socket_server(
string $address,
int &$error_code = null,
string &$error_message = null,
int $flags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,
?resource $context = null
): resource|false

客戶端

stream_socket_client — Open Internet or Unix domain socket connection

連接句柄

stream_socket_client(
string $address,
int &$error_code = null,
string &$error_message = null,
?float $timeout = null,
int $flags = STREAM_CLIENT_CONNECT,
?resource $context = null
): resource|false

簡(jiǎn)單運(yùn)用

<?php //服務(wù)端
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) { //循環(huán) 等待鏈接
    fwrite($conn, 'The local time is ' . date('n/j/Y g:i a') . "\n");//成功鏈接輸出以上內(nèi)容 大致為:The local time is 3/22/2023 11:13 am
    fclose($conn); //斷開(kāi)連接
  }
  fclose($socket); //斷開(kāi)socket
}
?>
<?php //客戶端
$fp = stream_socket_client("tcp://0.0.0.0:8000", $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    fwrite($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
    while (!feof($fp)) {
        echo fgets($fp, 1024);
    }
    fclose($fp);
}
?>

解釋

上面的事例,只能在服務(wù)器之間調(diào)用,而且每次鏈接都會(huì)斷開(kāi),一旦需要使用服務(wù)就需要不斷的進(jìn)行連接,不斷的進(jìn)行三次握手很浪費(fèi)資源,那么能不能實(shí)現(xiàn)一個(gè)呢,No Code No BB.

JsDemo

// 創(chuàng)建websocket
ws = new WebSocket("ws://"+domain+"/"+port);
// 當(dāng)socket連接打開(kāi)時(shí),輸入用戶名
ws.onopen = function(){}; //自定義 連接建立時(shí)處理操作,比如IM系統(tǒng)登陸信息操作
// 當(dāng)有消息時(shí)根據(jù)消息類(lèi)型顯示不同信息
ws.onmessage = function(){};// 操作服務(wù)端發(fā)來(lái)的消息 
ws.onclose = function() {
  console.log("連接關(guān)閉,定時(shí)重連");
  connect();//重新連接
};
ws.onerror = function() {
  console.log("出現(xiàn)錯(cuò)誤");
};

PHP實(shí)現(xiàn)三次握手

$socket = stream_socket_server('tcp://'.$ipServer.':'.$portNumber, $errno, $errstr);
while($conn = @stream_socket_accept($socket,$nbSecondsIdle))
{
            $message= fread($conn, 1024);
            send($conn,$message);
  					//@todo
  					//連接成功,有要保持連接,用來(lái)接收客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù)包 這里可以把這個(gè)連接$conn 保存在內(nèi)存當(dāng)中,通過(guò)Select or Swoole 事件去loop
            fputs ($conn, "OK\n");
}
function send($socket,$buffer){
    $Sec_WebSocket_Key = '';
    if (\preg_match("/Sec-WebSocket-Key: *(.*?)\r\n/i", $buffer, $match)) {
        $Sec_WebSocket_Key = $match[1];
    }
    $new_key = \base64_encode(\sha1($Sec_WebSocket_Key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
    $handshake_message = "HTTP/1.1 101 Switching Protocols\r\n"
        ."Upgrade: websocket\r\n"
        ."Sec-WebSocket-Version: 13\r\n"
        ."Connection: Upgrade\r\n"
        ."Sec-WebSocket-Accept: " . $new_key . "\r\n";
    $handshake_message .= "\r\n";
    var_dump($handshake_message);//打印握手信息,然后發(fā)送給客戶端,建立完整連接
    //socket_write($socket,$handshake_message);
    $len = @\fwrite($socket, $handshake_message);
    return 0;
}

到此這篇關(guān)于PHP實(shí)現(xiàn)web socket長(zhǎng)鏈接流程詳解的文章就介紹到這了,更多相關(guān)PHP web socket長(zhǎng)鏈接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • PHP設(shè)計(jì)模式之原型設(shè)計(jì)模式原理與用法分析

    PHP設(shè)計(jì)模式之原型設(shè)計(jì)模式原理與用法分析

    這篇文章主要介紹了PHP設(shè)計(jì)模式之原型設(shè)計(jì)模式,簡(jiǎn)單描述了原型設(shè)計(jì)模式的概念、原理并結(jié)合實(shí)例形式分析了php原型設(shè)計(jì)模式的定義與使用方法,需要的朋友可以參考下
    2018-04-04
  • 探討捕獲php錯(cuò)誤信息方法的詳解

    探討捕獲php錯(cuò)誤信息方法的詳解

    本篇文章是對(duì)捕獲php錯(cuò)誤信息的方法進(jìn)行了詳細(xì)的分析介紹,需要 的朋友參考下
    2013-06-06
  • 基于PHP實(shí)現(xiàn)原生增刪改查的示例代碼

    基于PHP實(shí)現(xiàn)原生增刪改查的示例代碼

    這篇文章主要介紹了如何利用php寫(xiě)個(gè)原生增刪改查功能,文中的示例代碼講解,對(duì)我們學(xué)習(xí)PHP有一定幫助,感興趣的小伙伴可以了解一下
    2022-04-04
  • PHP的instanceof詳解及使用方法介紹

    PHP的instanceof詳解及使用方法介紹

    php的instanceof是什么意思?instanceof由兩個(gè)單詞組成,instance和of,instance表示實(shí)例的意思,從字面上就可以理解這是實(shí)例引用的意思。instanceof?運(yùn)算符是?PHP?5?引進(jìn)的。在此之前用?is_a(),但是?is_a()?已經(jīng)過(guò)時(shí)了,最好用?instanceof。
    2023-05-05
  • php5.5使用PHPMailer-5.2發(fā)送郵件的完整步驟

    php5.5使用PHPMailer-5.2發(fā)送郵件的完整步驟

    PHPMailer已經(jīng)更新了很多版本了,本教程只針對(duì)老版本。下面這篇文章主要給大家介紹了關(guān)于php5.5使用PHPMailer-5.2發(fā)送郵件的完整步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • php用數(shù)組返回?zé)o限分類(lèi)的列表數(shù)據(jù)的代碼

    php用數(shù)組返回?zé)o限分類(lèi)的列表數(shù)據(jù)的代碼

    php自定義函數(shù)之用數(shù)組返回?zé)o限分類(lèi)的列表數(shù)據(jù),這樣的實(shí)現(xiàn)可以提高執(zhí)行的效率不要每次都從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)。
    2010-08-08
  • PHP中使用CURL偽造來(lái)路抓取頁(yè)面或文件

    PHP中使用CURL偽造來(lái)路抓取頁(yè)面或文件

    這個(gè)是用 PHP 偽造來(lái)路, 抓取文件或頁(yè)面的代碼, 挺簡(jiǎn)單的.
    2011-05-05
  • Apache服務(wù)器無(wú)法使用的解決方法

    Apache服務(wù)器無(wú)法使用的解決方法

    本篇文章介紹了Apache服務(wù)器在無(wú)法使用時(shí)候的一些解決方法。需要的朋友參考下
    2013-05-05
  • PHP命名空間用法實(shí)例分析

    PHP命名空間用法實(shí)例分析

    這篇文章主要介紹了PHP命名空間用法,結(jié)合實(shí)例形式分析了php命名空間的定義與簡(jiǎn)單使用操作技巧,需要的朋友可以參考下
    2019-09-09
  • PHP實(shí)現(xiàn)的Redis操作通用類(lèi)示例

    PHP實(shí)現(xiàn)的Redis操作通用類(lèi)示例

    這篇文章主要介紹了PHP實(shí)現(xiàn)的Redis操作通用類(lèi),結(jié)合實(shí)例形式分析了php實(shí)現(xiàn)的redis連接、隊(duì)列、集合、hash表、事務(wù)等相關(guān)操作封裝技巧,需要的朋友可以參考下
    2018-06-06

最新評(píng)論