摘要:服務器里直接運行啟動即可。包含了客戶端發來的數據幀信息使用獲取獲取數據內容使用向客戶端發送消息。長度最大不得超過。使用,通過幾行代碼即可寫出一個異步非阻塞多進程的服務器里使用運行。
WebSocket
使用Swoole可以很簡單的搭建異步非阻塞多進程的WebSocket服務器。
WebSocket服務器set(array( "daemonize" => false, "worker_num" => 2, )); $server->on("Start", function (swoole_websocket_server $server) { echo "Server Start... "; swoole_set_process_name("swoole_websocket_server"); }); $server->on("ManagerStart", function (swoole_websocket_server $server) { echo "ManagerStart "; }); $server->on("WorkerStart", function (swoole_websocket_server $server, $worker_id) { echo "WorkerStart "; if ($server->worker_id == 0){ swoole_timer_tick(10000,function($id) use ($server) { echo "test timer "; }); } }); $server->on("Open", function (swoole_websocket_server $server, $request) { echo "server: handshake success with fd{$request->fd} "; }); $server->on("Message", function (swoole_websocket_server $server, $frame) { echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish} "; $server->push($frame->fd, "this is server"); }); $server->on("Close", function ($ser, $fd) { echo "client {$fd} closed "; }); $server->start();
shell里直接運行php swoole_ws_server.php啟動即可。如果設置了后臺運行,可以使用下列命令強殺進程:
kill -9 $(ps aux|grep swoole|grep -v grep|awk "{print $2}")
或者重新啟動worker進程:
kill -10 $(ps aux|grep swoole_websocket_server|grep -v grep|awk "{print $2}")
輸出:
[2017-06-01 22:06:21 $2479.0] NOTICE Server is reloading now. WorkerStart WorkerStart
注意:
onMessage回調函數為必選,當服務器收到來自客戶端的數據幀時會回調此函數。
/** * @param $server * @param $frame 包含了客戶端發來的數據幀信息;使用$frame->fd獲取fd;$frame->data獲取數據內容 */ function onMessage(swoole_server $server, swoole_websocket_frame $frame)
使用$server->push()向客戶端發送消息。長度最大不得超過2M。發送成功返回true,發送失敗返回false。
function swoole_websocket_server->push(int $fd, string $data, int $opcode = 1, bool $finish = true);WebSocket客戶端
最簡單的是使用JS編寫:
socket = new WebSocket("ws://192.168.1.107:9501/"); socket.onopen = function(evt) { // 發送一個初始化消息 socket.send("I am the client and I"m listening!"); }; // 監聽消息 socket.onmessage = function(event) { console.log("Client received a message", event); }; // 監聽Socket的關閉 socket.onclose = function(event) { console.log("Client notified socket has closed",event); }; socket.onerror = function(evt) { console.log("Client onerror",event); };
Swoole里沒有直接提供swoole_websocket客戶端,不過通過引入WebSocketClient.php文件可以實現:
connect()) { echo "connect failed "; return false; } $send_data = "I am client. "; if (!$client->send($send_data)) { echo $send_data. " send failed "; return false; } echo "send succ "; return true;
上面代碼實現的是一個同步的swoole_websocket客戶端。發送完消息會自動關閉,可以用來與php-fpm應用協作:將耗時任務使用客戶端發送到swoole_websocket_server。
如何創建一個聊天室實際項目里,我們可以將用戶uid和fd進行雙向綁定(暫不考慮多臺服務器分布式部署情況),例如使用Redis保存:在onMessage進行用戶信息驗證后:
$this->redis->set($fd, $uid); $this->redis->set($uid, $fd);
后續需要指定給某人發消息,只需要根據uid/fd發送即可。在onClose事件里進行解綁操作。群發的話只需要遍歷一遍$server->connections即可。
示例(該項目只實現群發):
moell-peng/webim: PHP + Swoole 實現的簡單聊天室
https://github.com/moell-peng...
swoole內置Http服務器的支持。swoole版的http server相對于php-fpm,最大優勢在于高性能:代碼一次載入內存,后續無需再解釋執行。缺點是調試沒有nginx+php-fpm方便。
使用swoole,通過幾行代碼即可寫出一個異步非阻塞多進程的Http服務器:
on("Start", function() { echo "Start"; }); $serv->on("Request", function($request, $response) { var_dump($request->get); var_dump($request->post); var_dump($request->cookie); var_dump($request->files); var_dump($request->header); var_dump($request->server); $response->cookie("User", "Swoole"); $response->header("X-Server", "Swoole"); $response->end("Hello Swoole!
"); }); $serv->start();
shell里使用php swoole_http_server.php運行server。瀏覽器打開http://192.168.1.107:9502/即可看到輸出。
歡迎關注公眾號及時獲取最新文章推送!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/23057.html
摘要:消息隊列更常見的用途是主進程分配任務,子進程消費執行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內容直接退出。 前面幾節都是講解pcntl擴展實現的多進程程序。本節給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...
摘要:所以,我感覺學習,需要一個引導。學習參考鏈接喵星球特別厲害的一個官網的幾個框架文檔優勢先看一下的結構設計的應用場景的設計項目中引入一個簡易的具體參考一篇文章,集合和的簡易實例項目中引入結合致敬 前期學完了操作系統,特別是知道了進程,線程 調度的問題。回來看,發現了很多細節。第三次看文檔,最初經一個高手朋友的介紹,看swoole,說文檔寫的賊好。但是看的時候,也是很一頭霧水,只知道把de...
摘要:修復添加超過萬個以上定時器時發生崩潰的問題增加模塊,下高性能序列化庫修復監聽端口設置無效的問題等。線程來處理網絡事件輪詢,讀取數據。當的三次握手成功了以后,由這個線程將連接成功的消息告訴進程,再由進程轉交給進程。此時進程觸發事件。 本文示例代碼詳見:https://github.com/52fhy/swoo...。 簡介 Swoole是一個PHP擴展,提供了PHP語言的異步多線程服務器...
摘要:安裝準備或更高版本或更高版本安裝擴展配置支持編輯在其中加入擴展支持服務端代碼服務端客戶端代碼測試代碼在命令模式下輸入重新再開一個窗口可以用檢測如服務端客戶端如上,表示服務端啟動,客戶端連接服務端返回消息,一個閉環形成開發者頭條 1.安裝準備 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安裝swoole擴展 w...
摘要:配置了參數后將會啟用功能,務必要注冊個事件回調函數。周期性定時器一次性定時器清除定時器定時器回調函數注意最大不得超過。進程中不能添加定時器。建議在回調里寫定時器。定時器示例防止重復每隔觸發一次后執行此函數 本文示例代碼詳見:https://github.com/52fhy/swoo...。 重新打開日志 在1.8.11及之后版本支持重新打開日志:向Server主進程發送SIGRTMIN...
閱讀 852·2023-04-25 23:59
閱讀 3748·2021-10-08 10:04
閱讀 1685·2019-08-30 14:05
閱讀 1018·2019-08-30 13:58
閱讀 494·2019-08-29 18:41
閱讀 1130·2019-08-29 17:15
閱讀 2324·2019-08-29 14:13
閱讀 2749·2019-08-29 13:27