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)]