使用瀏覽器,PHP 來構建的應用,發現都是每次瀏覽器發送一次http 請求,PHP 回一個響應。javascript
這樣,後端的PHP 在處理屢次http請求是,每次都是不一樣的進程在處理。 這就加大了開銷, 並且,PHP 在處理屢次的http請求時,先後多個PHP進程之間的感受都沒啥聯繫,php
這些先後PHP進程之間怎麼才能共享一些資源呢?好比,和第三方的tcp鏈接, 數據庫鏈接, modbus tcp 的鏈接 能保持長鏈接, 先後多個PHP進程均可以共享,這樣就不用每次html
的PHP進程都要去從新創建tcp鏈接(太浪費資源了),java
基於這些思考? 那有什麼好的辦法呢????web
------------------------------------------------------數據庫
哈哈,這樣瀏覽器websocket client 和服務端端PHP的websocket server 就能夠通訊上了, 測試成功!!nice後端
下面是具體的代碼和方法步驟!瀏覽器
------------------------------------------------服務器
客戶端(瀏覽器), websocket 代碼:websocket
<html> <head> <meta charset="UTF-8"> <title>Web sockets test</title> <script type="text/javascript"> var ws; function ToggleConnectionClicked() { try { ws = new WebSocket("ws://47.88.215.46:9501");//鏈接服務器 ws.onopen = function(event){alert("已經與服務器創建了鏈接\r\n當前鏈接狀態:"+this.readyState);}; ws.onmessage = function(event){alert("接收到服務器發送的數據:\r\n"+event.data);}; ws.onclose = function(event){alert("已經與服務器斷開鏈接\r\n當前鏈接狀態:"+this.readyState);}; ws.onerror = function(event){alert("WebSocket異常!");}; } catch (ex) { alert(ex.message); } }; function SendData() { try{ var content = document.getElementById("content").value; if(content){ ws.send(content); } }catch(ex){ alert(ex.message); } }; function seestate(){ alert(ws.readyState); } </script> </head> <body> <button id='ToggleConnection' type="button" onclick='ToggleConnectionClicked();'>鏈接服務器</button><br /><br /> <textarea id="content" ></textarea> <button id='ToggleConnection' type="button" onclick='SendData();'>發送個人名字:beston</button><br /><br /> <button id='ToggleConnection' type="button" onclick='seestate();'>查看狀態</button><br /><br /> </body> </html>
客戶端效果:
服務端PHP建立的websocket server 代碼(使用了 swoole開源庫):
<?php //建立websocket服務器對象,監聽0.0.0.0:9502端口 $ws = new swoole_websocket_server("127.0.0.1", 9502); //監聽WebSocket鏈接打開事件 $ws->on('open', function ($ws, $request) { var_dump($request->fd, $request->get, $request->server); $ws->push($request->fd, "hello, welcome\n"); }); //監聽WebSocket消息事件 $ws->on('message', function ($ws, $frame) { echo "Message: {$frame->data}\n"; $ws->push($frame->fd, "server: {$frame->data}"); }); //監聽WebSocket鏈接關閉事件 $ws->on('close', function ($ws, $fd) { echo "client-{$fd} is closed\n"; }); $ws->start();
把websocket server 跑起來: