首頁 後端開發 php教程 php socket如何實現長連接

php socket如何實現長連接

May 14, 2018 pm 05:13 PM

長連線是什麼?

朋友應該都看過很多線上聊天工具和網頁線上聊天的工具。學校內有一種熟悉的功能,如果有人回覆你了,網站會馬上出現提示,此時你並沒有刷新頁面;Gmail也有此功能,如果郵箱裡收到了新的郵件,網站會馬上提醒你,即使你的網頁一直未刷新過。說到這裡大家肯定不陌生,就是複用一個連結持續不斷的進行資料互動。在現下許多網路商業場景都需要長連線的支持,例如:遊戲、聊天、資訊推送等等等,這麼多類似的功能都離不開長連線。前一章節介紹了php socket通訊,本章來介紹一下php socket長連結。

長連線和短連結

短連線一般都是單一請求數據,伺服器不能主動把資料「推」想客戶端,但有了長連線就好多了,利用後端與前端的技術組合起來,可以實現伺服器的“推送資訊”功能,如果資料庫裡面有更新,後端程式可以立即把資料“推送出來”,而不要多次反覆請求,多次建立連接,多次斷開。

其大概有以下的幾種解釋:

  1.  所謂長連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差;所謂短連接指建立SOCKET連接後發送後接收完資料後馬上斷開連接,一般銀行都使用短連接

  2. 長連接就是指在基於tcp的通訊中,一直保持連接,不管當前是否發送或接收資料。而短連接就是只有在有資料傳輸的時候才進行連接,客戶-伺服器通訊/傳輸資料完畢就關閉連接。

  3. 通訊方式   
    各網路元件之間共有兩種連接方式:長連接和短連接。所謂長連接,指在一個TCP連接上可以連續發送多個資料包,在TCP連接保持期間,如果沒有資料包發送,需 要雙方發檢測包以維持此連接。短連接是指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成後,則斷開此TCP連接,即每次TCP連接只完成一對 CMPP消息的發送。   
    現階段,要求ISMG之間必須採用長連結的通訊方式,建議SP與ISMG之間採用長連結的通訊方式。

  4. 短連線:例如http的,只是連線、請求、關閉,過程時間較短,伺服器若是一段時間內沒有收到請求即可關閉連線。長連線:有些服務需要長時間連接到伺服器,例如CMPP,一般需要自己做線上維持。

實作socket長連線

 每次我們造訪PHP腳本的時候,都是當所有的PHP腳本執行完成後,我們才得到回傳結果。如果我們需要一個腳本持續的運行,那麼我們就要透過php長連接的方式,來達到運行目的。

想要玩長連接就需要跟socket打交道,socket的封裝自然是少不的了。下面就透過程式碼來進行socket長連線。

其實例程式碼如下:

<?php
$sfd = socket_create(AF_INET, SOCK_STREAM, 0);  
socket_bind($sfd, "0.0.0.0", 1234);  
socket_listen($sfd, 511);  
socket_set_option($sfd, SOL_SOCKET, SO_REUSEADDR, 1);  
socket_set_nonblock($sfd);  
$rfds = array($sfd);  
$wfds = array(); 
 
do{  
    $rs = $rfds;  
    $ws = $wfds;  
    $es = array();  
    $ret = socket_select($rs, $ws, $es, 3);        
    //读取事件 
    foreach($rs as $fd){  
        if($fd == $sfd){ 
           $cfd = socket_accept($sfd);  
           socket_set_nonblock($cfd);  
            $rfds[] = $cfd;  
            echo "new client coming, fd=$cfd\n";  
        }else{  
            $msg = socket_read($fd, 1024); 
 
            if($msg <= 0){  
                //close  
            }else{                 
                echo "on message, fd=$fd data=$msg\n";  
            }  
        }  
    } 
  
    //写入事件 
    foreach($ws as $fd){  
        socket_write($fd, ........);  
    }       
}while(true);
?>
登入後複製

下面來提高下效率:

<?php
$sfd = stream_socket_server (&#39;tcp://0.0.0.0:1234&#39;, $errno, $errstr);  
stream_set_blocking($sfd, 0);  
$base = event_base_new();  
$event = event_new();  
event_set($event, $sfd, EV_READ | EV_PERSIST, &#39;ev_accept&#39;, $base);  
event_base_set($event, $base);  
event_add($event);  
event_base_loop($base); 
 
function ev_accept($socket, $flag, $base)  
{  
    $connection = stream_socket_accept($socket);  
    stream_set_blocking($connection, 0);  
    $buffer = event_buffer_new($connection, &#39;ev_read&#39;, NULL, &#39;ev_error&#39;,  $connection);      
    event_buffer_base_set($buffer, $base);  
    event_buffer_timeout_set($buffer, 30, 30);  
    event_buffer_watermark_set($buffer, EV_READ, 0, 0xffffff);  
    event_buffer_priority_set($buffer, 10);  
    event_buffer_enable($buffer, EV_READ | EV_PERSIST);  
} 
 
function ev_error($buffer, $error, $connection)  
{  
    event_buffer_disable($buffer, EV_READ | EV_WRITE);                  
    event_buffer_free($buffer);                  
    fclose($connection);                  
} 
 
function ev_read($buffer, $connection)  
{  
    $read = event_buffer_read($buffer, 256);  
    //do something....  
}
?>
登入後複製

隨著人數的成長,並發的提升,單一進程已經滿足不了需求了,現成的就有擴展和函式庫來解決這個事,比如:swoole,workerman等?但是,我們在使用php來開發web的時候,也沒有使用webserver相關的函式庫來做開發對不對?咱只是簡單的echo而已。這些繁雜的事都交給了nginx或是apache,是他們義無反顧的頂在前面,讓我們可以專心寫邏輯。寫socket服務不比寫web高級,都是打碼,都是完成需求,通信那層都是固定的,只不過一個由nginx完成,另一個由自己完成。 。可是現在不需要自己完成了,類似nginx+fpm的方案,fooking+fpm=php長連接,gateway用來承載連接,router用來轉送訊息。

其程式碼如下:

<?php
$sid = $_SERVER[&#39;SESSIONID&#39;];//这是sessionid  
$data = file_get_contents("php://input");//这样就能拿到请求内容了  
//想要返回消息只需要两步  
header(&#39;Content-Length: 11&#39;);//返回给客户端字节数  
echo "hello world";  
//想要给别的用户发消息  
include &#39;api.php&#39;;  
$router = new RouterClient(&#39;router host&#39;, &#39;router port&#39;);  
$router->sendMsg(用户sessionid, "fuck you");  
//想要给所有人要消息  
$router->sendAllMsg("fuck all");  
//想给指定组发消息(类似redis的pub/sub)  
$router->publish("channel name", "fuck all");
?>
登入後複製

【相關教學推薦】

1. 《php.cn獨孤九賤(4 )-php影片教學

2.   php程式設計從入門到精通全套教學

#

以上是php socket如何實現長連接的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

討論 CakePHP 討論 CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP 是 PHP 的開源框架。它旨在使應用程式的開發、部署和維護變得更加容易。 CakePHP 基於類似 MVC 的架構,功能強大且易於掌握。模型、視圖和控制器 gu

CakePHP 檔案上傳 CakePHP 檔案上傳 Sep 10, 2024 pm 05:27 PM

為了進行文件上傳,我們將使用表單助理。這是文件上傳的範例。

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

CakePHP 快速指南 CakePHP 快速指南 Sep 10, 2024 pm 05:27 PM

CakePHP 是一個開源MVC 框架。它使應用程式的開發、部署和維護變得更加容易。 CakePHP 有許多函式庫可以減少大多數常見任務的過載。

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

See all articles