摘要:服務(wù)器里直接運行啟動即可。包含了客戶端發(fā)來的數(shù)據(jù)幀信息使用獲取獲取數(shù)據(jù)內(nèi)容使用向客戶端發(fā)送消息。長度最大不得超過。使用,通過幾行代碼即可寫出一個異步非阻塞多進程的服務(wù)器里使用運行。
WebSocket
使用Swoole可以很簡單的搭建異步非阻塞多進程的WebSocket服務(wù)器。
WebSocket服務(wù)器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啟動即可。如果設(shè)置了后臺運行,可以使用下列命令強殺進程:
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回調(diào)函數(shù)為必選,當(dāng)服務(wù)器收到來自客戶端的數(shù)據(jù)幀時會回調(diào)此函數(shù)。
/** * @param $server * @param $frame 包含了客戶端發(fā)來的數(shù)據(jù)幀信息;使用$frame->fd獲取fd;$frame->data獲取數(shù)據(jù)內(nèi)容 */ function onMessage(swoole_server $server, swoole_websocket_frame $frame)
使用$server->push()向客戶端發(fā)送消息。長度最大不得超過2M。發(fā)送成功返回true,發(fā)送失敗返回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) { // 發(fā)送一個初始化消息 socket.send("I am the client and I"m listening!"); }; // 監(jiān)聽消息 socket.onmessage = function(event) { console.log("Client received a message", event); }; // 監(jiān)聽Socket的關(guān)閉 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文件可以實現(xiàn):
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;
上面代碼實現(xiàn)的是一個同步的swoole_websocket客戶端。發(fā)送完消息會自動關(guān)閉,可以用來與php-fpm應(yīng)用協(xié)作:將耗時任務(wù)使用客戶端發(fā)送到swoole_websocket_server。
如何創(chuàng)建一個聊天室實際項目里,我們可以將用戶uid和fd進行雙向綁定(暫不考慮多臺服務(wù)器分布式部署情況),例如使用Redis保存:在onMessage進行用戶信息驗證后:
$this->redis->set($fd, $uid); $this->redis->set($uid, $fd);
后續(xù)需要指定給某人發(fā)消息,只需要根據(jù)uid/fd發(fā)送即可。在onClose事件里進行解綁操作。群發(fā)的話只需要遍歷一遍$server->connections即可。
示例(該項目只實現(xiàn)群發(fā)):
moell-peng/webim: PHP + Swoole 實現(xiàn)的簡單聊天室
https://github.com/moell-peng...
swoole內(nèi)置Http服務(wù)器的支持。swoole版的http server相對于php-fpm,最大優(yōu)勢在于高性能:代碼一次載入內(nèi)存,后續(xù)無需再解釋執(zhí)行。缺點是調(diào)試沒有nginx+php-fpm方便。
使用swoole,通過幾行代碼即可寫出一個異步非阻塞多進程的Http服務(wù)器:
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/即可看到輸出。
歡迎關(guān)注公眾號及時獲取最新文章推送!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/23057.html
摘要:消息隊列更常見的用途是主進程分配任務(wù),子進程消費執(zhí)行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...
摘要:所以,我感覺學(xué)習(xí),需要一個引導(dǎo)。學(xué)習(xí)參考鏈接喵星球特別厲害的一個官網(wǎng)的幾個框架文檔優(yōu)勢先看一下的結(jié)構(gòu)設(shè)計的應(yīng)用場景的設(shè)計項目中引入一個簡易的具體參考一篇文章,集合和的簡易實例項目中引入結(jié)合致敬 前期學(xué)完了操作系統(tǒng),特別是知道了進程,線程 調(diào)度的問題。回來看,發(fā)現(xiàn)了很多細節(jié)。第三次看文檔,最初經(jīng)一個高手朋友的介紹,看swoole,說文檔寫的賊好。但是看的時候,也是很一頭霧水,只知道把de...
摘要:修復(fù)添加超過萬個以上定時器時發(fā)生崩潰的問題增加模塊,下高性能序列化庫修復(fù)監(jiān)聽端口設(shè)置無效的問題等。線程來處理網(wǎng)絡(luò)事件輪詢,讀取數(shù)據(jù)。當(dāng)?shù)娜挝帐殖晒α艘院螅蛇@個線程將連接成功的消息告訴進程,再由進程轉(zhuǎn)交給進程。此時進程觸發(fā)事件。 本文示例代碼詳見:https://github.com/52fhy/swoo...。 簡介 Swoole是一個PHP擴展,提供了PHP語言的異步多線程服務(wù)器...
摘要:安裝準(zhǔn)備或更高版本或更高版本安裝擴展配置支持編輯在其中加入擴展支持服務(wù)端代碼服務(wù)端客戶端代碼測試代碼在命令模式下輸入重新再開一個窗口可以用檢測如服務(wù)端客戶端如上,表示服務(wù)端啟動,客戶端連接服務(wù)端返回消息,一個閉環(huán)形成開發(fā)者頭條 1.安裝準(zhǔn)備 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安裝swoole擴展 w...
摘要:配置了參數(shù)后將會啟用功能,務(wù)必要注冊個事件回調(diào)函數(shù)。周期性定時器一次性定時器清除定時器定時器回調(diào)函數(shù)注意最大不得超過。進程中不能添加定時器。建議在回調(diào)里寫定時器。定時器示例防止重復(fù)每隔觸發(fā)一次后執(zhí)行此函數(shù) 本文示例代碼詳見:https://github.com/52fhy/swoo...。 重新打開日志 在1.8.11及之后版本支持重新打開日志:向Server主進程發(fā)送SIGRTMIN...
閱讀 854·2023-04-25 23:59
閱讀 3751·2021-10-08 10:04
閱讀 1688·2019-08-30 14:05
閱讀 1021·2019-08-30 13:58
閱讀 497·2019-08-29 18:41
閱讀 1133·2019-08-29 17:15
閱讀 2326·2019-08-29 14:13
閱讀 2751·2019-08-29 13:27