1. 程式人生 > 其它 >ThinkPHP 5.0 + Workerman 保姆教程 以及常見問題

ThinkPHP 5.0 + Workerman 保姆教程 以及常見問題

我伺服器linux系統所以本片文章以Linux系統為主,windows系統可以到workeman官方論壇尋找問題。

ThinkPHP 5.0 的官方手冊寫的workeman模糊不清,導致人會遇到各式各樣的問題。

Workerman
Workerman是一款純PHP開發的開源高效能的PHP socket 伺服器框架。被廣泛的用於手機app、手遊服務端、網路遊戲伺服器、聊天室伺服器、硬體通訊伺服器、智慧家居、車聯網、物聯網等領域的開發。 支援TCP長連線,支援Websocket、HTTP等協議,支援自定義協議。基於workerman開發者可以更專注於業務邏輯開發,不必再為PHP Socket底層開發而煩惱。

1.首先通過 composer 安裝(這裡需要根據tp版本號和workerman版本號來安裝,官方文件有點不清楚;我的是fastadmin,用的是tp5.0.24版本,只能安裝1.0版本擴充套件)


composer require topthink/think-worker
//直接在終端執行如果報錯是tinkphp版本過低 (很多通過寶塔面板安裝的)
//我們使用下方程式碼執行
composer require topthink/think-worker=1.0.*

2.新增啟動服務檔案server.php,在專案根目錄;(就是在thinkphp目錄裡邊新建一個php檔案)

#!/usr/bin/env php
<?php define('APP_PATH', __DIR__ . '/application/'); define('BIND_MODULE','push/Worker'); // 載入框架引導檔案 require __DIR__ . '/thinkphp/start.php';

3.在push/controller模組新增服務處理類(在 根目錄/application 裡邊新建)
在這裡插入圖片描述

<?php

namespace app\push\controller;

use think\worker\Server;

class Worker extends Server
{
    protected
$socket = 'websocket://push.app:2346'; /** * 收到資訊 * @param $connection * @param $data */ public function onMessage($connection, $data) { $connection->send('我收到你的資訊了'); } /** * 當連線建立時觸發的回撥函式 * @param $connection */ public function onConnect($connection) { } /** * 當連線斷開時觸發的回撥函式 * @param $connection */ public function onClose($connection) { } /** * 當客戶端的連線上發生錯誤時觸發 * @param $connection * @param $code * @param $msg */ public function onError($connection, $code, $msg) { echo "error $code $msg\n"; } /** * 每個程序啟動 * @param $worker */ public function onWorkerStart($worker) { } } send('我收到你的資訊了'); } /** * 當連線建立時觸發的回撥函式 * @param $connection */ public function onConnect($connection) { } /** * 當連線斷開時觸發的回撥函式 * @param $connection */ public function onClose($connection) { } /** * 當客戶端的連線上發生錯誤時觸發 * @param $connection * @param $code * @param $msg */ public function onError($connection, $code, $msg) { echo "error $code $msg\n"; } /** * 每個程序啟動 * @param $worker */ public function onWorkerStart($worker) { } }

4.在命令列下執行,啟動監聽服務

首先連線到終端,cd跳轉到專案根目錄(也就是server.php所在的目錄)

php server.php start //測試時啟動方式 會自動關閉

php server.php start -d //上線時使用此方法啟動

錯誤總結

一般啟動時候會遇到很多問題,上邊基本不會出現問題,當執完第4部報錯,請先檢查php函式是否被禁止

//使用workerman需要解除以下函式的禁用

stream_socket_server
stream_socket_client
pcntl_signal_dispatch
pcntl_signal
pcntl_alarm
pcntl_fork
posix_getuid
posix_getpwuid
posix_kill
posix_setsid
posix_getpid
posix_getpwnam
posix_getgrnam
posix_getgid
posix_setgid
posix_initgroups
posix_setuid
posix_isatty

出現cannot assign requested address
在這裡插入圖片描述

需要更換下圖地址為0.0.0.0或者127.0.0.1,原因是由於你的伺服器的外網ip實際上不屬於你這臺伺服器,這個ip實際上類似一個代理裝置,客戶端發的請求先到這個代理上,然後轉發到你的真實伺服器。由於這個ip不屬於你這臺伺服器,所以監聽不了,啟動會報錯。阿里雲,騰訊雲等等比較常見
在這裡插入圖片描述

具體可以參考下圖進行配置:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-L1LayoYg-1616486108799)(https://z3.ax1x.com/2021/03/23/67GmfP.png#pic_center)]