使用php的swoole擴充套件實現資料實時更新 下

2021-07-31 06:16:44 字數 1594 閱讀 1502

先說一下業務場景。我們目前的大多數應用都是以服務端+介面+客戶端的方式去協調工作的,這樣的好處在於不論是處在何種終端的情況下,都可以完美的和服務端相容。這樣就輕鬆實現了mvc各個部分的真正解耦。但是提高程式的友好性還是有很多路要走,其中乙個大家都會遇到的就是資料實時更新的問題。比如乙個使用者在手機上做了新增操作,這時候其他的終端也應該及時顯示資料的變化情況。這個對於手機來說還算好辦,因為現在的各種推送服務完全可以滿足需求,當收到推送更新時,根據推送內容請求相應介面就可以了。但是放到pc上就不是這麼回事了。瀏覽器和http協議的特殊性質不得不讓我們另闢蹊徑。

舉乙個大家生活中都會遇到的場景:

某個週末你想要和女朋友去看一場電影,你在自己的pc上找到了某場的場次和座位。正當你要下單支付時,系統提示該座位已經售出,這時你不得不重新回到選座頁面重新挑選。那如果改進一下產品體驗,當有別的使用者已經購買某個座位的時候,瀏覽器會及時將座位標識已售出,這樣你就不用來回操作,節省操作時間。

** 針對上述的情景呢,這裡有乙個系統間互動的流程圖:**

//這裡的$frame->fd是指當前的websocket連線id,swoole會通過此id傳送給對應的接收方,可以理解為手機號碼

$fd[$frame->fd] = $frame->fd;

$fd = json_encode($fd);

$redis->set($frame->data,$fd);

}});

$server->on('request', function

($req, $respone)

$err = 0;

if(is_array($fd))

}if($err)}}

$respone->end("success");

});

** 需要強調的一點是監聽http請求的server並不具備push方法,所以這裡通過全域性變數的方式使用websocket的$server來向客戶端傳送資料 **

以上就是解決問題的大概思路了,文章最後會附上websocket的服務端原始碼,因為業務稍多所以裡面整合了很多業務**,而且需要執行起來必須要先安裝swoole的擴充套件,安裝方式上篇文章會有說明,所以這裡僅供參考

對於圖中另一種使用redis的方式也是很好的,之前採用了redis發布訂閱的模式基本可以達到想要的效果。但是中間遇到乙個問題redis的subscribe執行幾十秒後,就會丟擲乙個redi***ception。原因處在於,php的redis庫使用的subscribe是使用php內建的socket,而php.ini預設是設定了socket的超時時間是60秒,所以大家只要找到default_socket_timeout 這個配置項,把時間改長點就可以了。或者在**中加入ini_set('default_socket_timeout', -1);

php 安裝swoole擴充套件

2 解壓unzip swoole src master.zip 3 編譯發現沒有configure 使用phpize 生成 configure 進入到swoole 解壓後的目錄 cd usr local src swoole src master 執行phpize usr local php7 bi...

php安裝swoole擴充套件

pecl download swoole解壓並進入目錄 tar zxvf swoole 4.3.3.tar.gz cd swoole 4.3.3執行phpize生成configure可執行檔案 這裡的目錄一定是你要安裝swoole擴充套件對應的php版本的安裝目錄,如果存在多個php版本一定要注意這...

PHP安裝swoole擴充套件

個人伺服器進行swoole安裝 伺服器 centos 6.8版本 swoole手冊建議pecl安裝 pecl install swoole執行這個命令之後發現沒有pecl這個命令 所以只能進行pecl安裝 yum install php71w pear php71w develphp71w這個是因為...