ThinkPHP 5.1下使用PHPSocket.IO實現websocket通信

https://beltxman.com/1885.htmlphp

PHPSocket.IO的官方介紹:css

PHPSocket.IO是PHP版本的Socket.IO服務端實現,基於workerman開發,用於替換node.js版本Socket.IO服務端。PHPSocket.IO底層採用websocket協議通信,若是客戶端不支持websocket協議, 則會自動採用http長輪詢的方式通信。PHPSocket.IO實現的Polling通訊機制包括Adobe Flash Socket、AJAX長輪詢、JSONP輪詢等。具體採用哪一種機制通信對於開發者徹底透明, 開發者使用的是統一的接口。html

項目github地址https://github.com/hsu1943/thinksocketio,項目已經作了不少更新,請按照項目readme使用。

下面咱們使用ThinkPHP5.1框架來整合PHPSocket.IO實現客戶端和服務端的通信。node

使用的本地開發環境是PHP5.6.30 + Apache2.4.25jquery

建立新項目

// 使用ThinkPHP5.1新建項目thinksocket;
$ composer create-project topthink/think thinksocket 5.1.*; // 進入項目,下載workerman/phpsocket.i包; $ cd thinksocket $ composer require workerman/phpsocket.io 
Bash

這樣你的安裝工做就作好了。接下來配置須要的模git

配置模塊

結合前陣子的文章:ThinkPHP 5.1自動生成模塊及目錄、文件
咱們編輯好build.php文件:github

return [ // 生成應用公共文件 '__file__' => ['common.php'], // 定義socketio模塊的自動生成 'socketio' => [ '__file__' => ['common.php'], '__dir__' => ['controller', 'model', 'view'], 'controller' => ['Index', 'Server'], 'model' => [], 'view' => ['index/index'], ], // 其餘更多的模塊定義 ]; 
PHP

而後運行web

$ php think build
Successed
Bash

這樣就有了socketio模塊下面controllerIndex.phpServer.php兩個控制器和view下一個index/index一個視圖。sql

建立服務端

編輯控制器Server.php爲(具體參考註釋):thinkphp

<?php namespace app\socketio\controller; use Workerman\Worker; use PHPSocketIO\SocketIO; use think\Db; class Server{ public function index(){ // 在2021端口建立服務 $io = new SocketIO(2021); $io->on('connection', function($socket)use($io){ $socket->on('chat message', function($msg)use($io){ $io->emit('chat message', $msg); }); // 監聽到新的客戶端鏈接即在服務端輸出'new connection' echo 'new connection'."\n"; // 並向服務端發送'鏈接成功' $socket->emit('success', '鏈接成功'); // 服務端發送消息過來 $socket->on('sendMsg', function($msg)use($io){ // 在服務端輸出消息 echo $msg."\n"; // 在收到的消息前面拼接'收到'後向客戶端發送回去 $io->emit('sendMsg', '收到"'.$msg.'"'); // 將接受到的消息存儲到數據庫 $data['msg'] = $msg; Db::table('msg')->insert($data); }); }); // 啓動服務 Worker::runAll(); } // 測試數據庫連接 public function ceshi(){ $msg = Db::table('msg')->select(); var_dump($msg); } } 
PHP

爲了測試,在數據庫新建了一張表msg用來存儲客戶端發送過來的消息。

CREATE TABLE `msg` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `msg` varchar(250) DEFAULT NULL, `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4; 
SQL

這樣一個能夠返回鏈接成功消息、接收消息、回覆消息、存儲消息的簡單服務端就作好了。

建立客戶端

咱們在Index.php控制器中這樣寫:

<?php namespace app\socketio\controller; use think\Controller; class Index extends Controller { public function index() { return view(); } } 
PHP

在對應的模版文件view/index/index.html中代碼:

<!DOCTYPE html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>測試WebSocket</title> </head> <body> <input type="text" name="" id="msg"> <button id='send'>發送消息</button> </body> <script src='https://cdn.bootcss.com/socket.io/2.0.3/socket.io.js'></script> <script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script> <script> // 若是服務端不在本機,請把127.0.0.1改爲服務端ip var socket = io('http://127.0.0.1:2021'); // 當鏈接服務端成功時觸發connect默認事件 socket.on('connect', function(){ console.log('connect success'); }); socket.on('success', function(msg){ // 鏈接後彈出服務端返回的消息'鏈接成功' alert(msg); }); socket.on('sendMsg', function(msg){ // 將服務端返回的消息輸出到控制檯 console.log(msg); }); // 向服務端發送消息 $('#send').on('click', function(){ var text = $('#msg').val(); socket.emit('sendMsg', text); // alert(text); }) </script> </html> 
HTML

到這裏,一個具有鏈接服務端,發送消息,接受並輸出消息到控制檯的簡單websocket客戶端就建好了。

爲服務端綁定入口文件

在項目的public文件夾下新建一個入口文件server.php並將其綁定到socketio模塊的Server控制器index方法;
入口文件server.php代碼:

<?php // [ 應用入口文件 ] namespace think; // 加載基礎文件 require __DIR__ . '/../thinkphp/base.php'; // 執行應用並響應(綁定) Container::get('app')->bind('socketio/Server')->run()->send(); 
PHP

測試通信

運行服務端
直接運行項目public目錄下的server.php

D:\xampp\htdocs\thinksocket\public>php server.php ----------------------- WORKERMAN ----------------------------- Workerman version:3.5.11 PHP version:5.6.30 ------------------------ WORKERS ------------------------------- worker listen processes status PHPSocketIO socketIO://0.0.0.0:2021 1 [ok] 
Bash

ThinkPHP 5.1下使用PHPSocket.IO實現websocket通信
這個輸出表示PHPSocketIO已經成功在2021端口運行監聽中。
咱們打開瀏覽器打開http://localhost/thinksocket/public/index.php/socketio/頁面;
能夠看到頁面會彈出‘連接成功’,同時能夠看到服務端cmd終端上打印出new connection,同事瀏覽器控制檯會輸出connect success,表明已經成功與服務端鏈接上。
測試發送消息
在頁面輸入框內輸入任意信息,服務端cmd終端將會打印信息,表明服務端收到信息,而後服務端控制檯將會輸出‘收到’+發送的信息。
至此,咱們的測試完成。

舒適提示:對程序修改後須要從新啓動服務端才能生效

以上只是簡單的利用ThinkPHP5.1的框架測試PHPSocket.IO通信。

源代碼地址:https://github.com/hsu1943/thinksocketio
供你們參考。

update (代碼以Github爲準)

    • 2019/01/22:Github項目代碼已經更新,加入了用戶惟一表示記錄以及向指定用戶推送消息。詳情看:ThinkPHP 5.1+PHPSocket.IO實現websocket搭建聊天室+私聊
    • 2019-06-19 增長在線人數統計,在線用戶列表,修改暱稱,添加系統主動推送接口(廣播或私信);
相關文章
相關標籤/搜索