php – swoole – 架設 websocket 進階範例

看過 上一篇(swoole 架設 websocket 範例) 後,應該都有概念了,這次用非常簡單的程式碼建立一個範例,會讓你更有感覺資料的傳送/接收。

影片範例

Composer

使用 jsnlib/swoole 輔助工具來簡化 onMessage 事件。

 

Swoole.php

 

client.html

 

Linux – Ubuntu – 8080 被佔用的解決方法

使用 netstat 查找哪個程序佔用

看到了如

tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 31814/php,編號是 31814,我們將他殺掉並重新啟動伺服器

參考網友

 

php – swoole – 架設 websocket 簡單範例

安裝 swoole 擴展 以後,接著我們要示範是否能建立 websocket 給 Client 端。

swoole.php

  • $ws->push() 推送給 Client 端數據。參考
  • 在 callback 中的 echo, print_r, var_dump … 的輸出,都會顯示在 Command-Lind 而不是給 Client 端。

 

Client 的 JS 程式碼 index.html

 

使用 command line 觸發 Swoole

如果使用如 SSH 連接遠端主機下了這個指令,一旦關閉操作視窗後,運行 websocket 會停止。要是你希望 Linux 使用者離開後,服務仍然啟動,可以使用 screen 指令 (或 nohup 指令)。例如

關閉視窗後重新回到 Linux, 要顯示哪些 php 被運行,可以使用

可使用 kill 指令刪掉來關閉服務

參考網友

瀏覽器運行

上方 onMessage 目前會將接收到的訊息,發送給所有人。也就是說,如果是A發送到 websocket,那麼 websocket 也會把訊息發送給 A,B,C,D…… 如果自己發送的訊息不想接收到,可以參考進階範例

php – swoole 安裝

Swoole

PHP的異步、並行、高性能網絡通信引擎,使用純C語言編寫,提供了PHP語言的異步多線程服務器,異步TCP/UDP網絡客戶端,異步MySQL,異步Redis,數據庫連接池,AsyncTask,消息隊列,毫秒定時器,異步文件讀寫,異步DNS查詢。 Swoole內置了Http/WebSocket服務器端/客戶端、Http2.0服務器端。

我在 Ubuntu 16 Command-Line 直接鍵入 phpize 出現

那就代表沒有安裝,我們先安裝它。用 aptitude 搜尋

  • 其中 php7.1-dev 可以更換成你的任何 7.x 版本,例如 php7.0-dev

查看安裝好的 phpize 位置

 

安裝 swoole

可用 aptitude 安裝/確定以下工具,參考參考

  • cmake
  • gcc
  • autoconf
  • pcre
  • make

使用 wget 下載封包,我找到下載 tar.gz 的網址

解壓我下載的位置,並依序安裝指令

安裝好後,修改 php.ini 。注意 php.ini 有兩個

  • /etc/php/7.1/cli/php.ini <—- 務必修改它,因為 swoole 要從 command line 呼叫
  • /etc/php/7.1/apache2/php.ini <—- 也可修改它,若要從瀏覽器執行 swoole 就需要修改

參考官方說明

** 如果在 cli 底下運行出現 PHP Fatal error: Class ‘swoole_http_server’ not found 那就是改錯 php.ini 了。記得要改 /etc/php/7.1/cli/php.ini。

接著在 extension 的部分新加入 swoole.so

存檔後重啟 apache

檢查 swoole 是否出現在模組列表

並使用 phpinfo() 可以查看到 swoole 。

架設完畢後,我們可以寫簡單測試來看看是否正常運作

  1. php – swoole – 架設 websocket 簡單範例
  2. php – swoole – 架設 websocket 進階範例

php – WebSocket 架設

安裝套件

我們使用 Ratchet 這款 PHP WebSocket 架設。使用這款套件是不需要安裝其他元件,安裝執行比較簡單,但我後來推薦使用 Swoole 這個效能很好的 PHP 擴展,Swoole 在一開始安裝上稍微麻煩一點,但在後續使用上會簡單許多。以下介紹 Ratchet 的安裝方式:

我們使用 composer.json 安裝,先建立 /composer.json

雖然官方範例使用 psr-0 較舊的規範,不過不會影響我們的範例。接著運行指令下載

建立應用程式 (Application)

在 /src/MyApp/Chat.php 建立這個官方範例

結構上會是這樣

實體化

Chat.php 是我們應用程式的類別,我們需要將它實體化運行。在 /bin/chat-server.php 加入

我們建立個一個輸入/輸出的服務類別,並告訴伺服器運行的事件要不斷循環,並監聽 Port 8080 的任何請求。我們打開 terminal ,來到跟目錄底下運行

這就我們的程式已經開始執行監聽了。

開始溝通

首先,我們建立 2 個 HTML 來示範。/index.html 與 /send.html。

index.html

打開網址 http://localhost/index.html 在 Console 的地方會看到連線已經建立

然後可以看看 terminal 出現了新連線的提示、還有接收到什麼訊息

接著 send.html 寫入

打開網址 http://localhost/send.html 在 Console 的地方會一樣會看到連線已經建立。

回到 index.html 會發現 Console 出現接收到的字串

不論重新整理 index.html 或 send.html 都能再另外一方接收到傳遞訊息。我們可以看到連線狀態都保持 websocket 的連線。

影片示範