workerman開發過程中遇到的一些常見的問題與解決方法

Laravel00發表於2021-12-03

文章來自:微信公眾號-PHP自學中心


個人筆記:在workerman開發過程中,遇到了很多問題,我都總結了一下,與大家分享。如果你在實戰中有不懂的,建議去看看這套教程,希望能幫助到你!

ThinkPHP5與workerman實戰—線上客服
連結:www.mano100.cn/thread-158-1-1.html

workerman無法正常訪問

問題描述:在阿里雲ECS上部署了workerman的應用(ECS是專有網路),在ECS安全組裡已經允許workerman需要的全部埠,但是外網一直不能正常開啟(注,其他服務,比80埠外部是可以用訪問的)。telnet連線顯示“No route to host”,而且我是關閉了centos7firewalld防火牆的,這讓我很困惑。

問題原因:
因為對centos7瞭解不多,關閉firewalld.service後,並沒有關閉iptable.service導致的。

解決問題:
1、安全組入方向,設定workerman 的埠範圍;
2、關閉firewalld防火牆和修改/etc/sysconfig/iptables規則。

workerman 不能關閉怎麼辦

問題描述:啟動指令碼里執行Worker::stopAll()並不能停止workerman,Worker::stopAll()只有在執行workerman的主程式裡執行才有效,外部其它程式執行沒有效果。

停止Workerman的流程是
1、找到Workerman主程式pid
2、給pid傳送SIGINT訊號(posix_kill(SIGINT, pid))
3、workerman主程式收到SIGINT訊號後自身執行Worker::stopAll()完成服務停止。

這三個步驟workerman內部應封裝好,呼叫流程是
1、設定$argv = 'stop';
2、執行Worker::runAll();

3 workerman可以一直執行麼
workerman可以一直執行,以daemon(守護程式)方式啟動workerman即可後臺一直執行。

啟動停止workerman
啟動
debug(除錯)方式啟動

php start.php start

daemon(守護程式)方式啟動

php start.php start -d

停止

php start.php stop

重啟

php start.php restart

平滑重啟

php start.php reload

檢視狀態

php start.php status

debugdaemon方式區別:
1、以debug方式啟動,程式碼中echovar_dumpprint等列印函式會直接輸出在終端。
2、以daemon方式啟動,程式碼中echovar_dumpprint等列印會預設重定向到/dev/null檔案,可以通過設定Worker::$stdoutFile = '/your/path/file';來設定這個檔案路徑。
3、以debug方式啟動,終端關閉後workerman會隨之關閉並退出。
4、以daemon方式啟動,終端關閉後workerman繼續後臺正常執行。

workerman無法socket怎麼辦

Workerman是一款純PHP開發的開源高效能的PHP socket 伺服器框架。被廣泛的用於手機app、手遊服務端、網路遊戲伺服器、聊天室伺服器、硬體通訊伺服器、智慧家居、車聯網、物聯網等領域的開發。但是在配置workerman情況下,不免有些意想不到的錯誤,下面小編整理網上資料並整合自身遇到的問題,給出以下幾種常用的解決方案。

問題描述:
現象1
啟動後報錯類似如下:

php start.php start
PHP Warning:  stream_socket_server(): unable to connect totcp://xx.xx.xx.xx:xxxx (Address already in use) 
in /home/workerman-chat/Workerman/Worker.php on line xxxx

關鍵字:Address already in use

失敗原因:埠被佔用,無法啟動。
可以通過命令netstat -anp | grep埠號來找出哪個程式佔用了埠。
然後停止對應的程式釋放埠解決。

如果不能停止對應埠的程式,可以通過更換workerman的埠解決。
如果是Workerman佔用的埠,又無法通過stop命令停止(一般是丟失pid檔案或者主程式被開發者kill了導致),可以通過執行以下兩個命令殺死Workerman程式。

`kill all php
ps aux|grep WorkerMan|awk '{print $2}'|xargs kill -9`

現象2
啟動後報錯類似如下:

PHP Warning:  stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) 
in /home/GatewayWorker/Workerman/Worker.php on line xxxx

關鍵字:Cannot assign requested address

失敗原因:
啟動指令碼ip引數寫錯,不是本機ip,請填寫本機ip機或者填寫 0.0.0.0(表示監聽本機所有ip)即可解決。

提示:Linux系統可以通過命令 ifconfig檢視本機所有網路卡ip

如果您是騰訊雲使用者,注意您的公網ip實際是代理伺服器ip,公網ip並不屬於你的伺服器,所以無法通過公網ip繫結,但是可以通過0.0.0.0來繫結。

現象3
啟動後報錯類似如下:

Waring stream_socket_server has been disabled **for**security reasons in...

失敗原因:
stream_socket_server 函式被php.ini禁用

解決方法
1、執行php --ini 找到php.ini檔案
2、開啟php.ini找到disable_functions一項,將stream_socket_server禁用項刪掉

現象4
啟動後報錯類似如下:

PHP Warning:  stream_socket_server(): unable to connect to tcp://0.0.0.0:xxx (Permission denied)

失敗原因
linux下監聽埠如果小於1024,需要root許可權。

解決辦法
使用大於1024的埠或者使用root使用者啟動服務。

現象5
啟動後報錯類似如下:

WebSocket connection to 'ws://x.x.x.x:2346/'failed: 
Error in connection establishment:net::ERR_NAME_NOT_TIMED_OUT

失敗原因
伺服器防火牆擋住了設定的埠,這裡於2346為例。

解決辦法
進入Linux vim編輯伺服器防火牆檔案,新增你需要開發的伺服器埠儲存後重啟防火牆。

[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# iptables -nvl #檢視允許訪問的埠
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# vim /etc/sysconfig/iptables #編輯
[root@iZwz9xxxxxxxxxxxxxxxxxx conf]# /etc/init.d/iptables restart #重啟

workerman無法監聽怎麼辦

問題描述:根據手冊一步一步走下來,但是發現在啟動監聽的時候,發生了錯誤:

[thinkexceptionThrowableError]
Fatal error: Call to undefined **function**WorkermanLibpcntl_signal()

本地執行環境:win10+php7,已經用composer下載了workerman-for-win

解決辦法:
如果是在windows下面composer安裝的話,在文件第一步composer **require**topthink/think-worker
的時候,它還會順帶下載workerman/workerman,但是因為是在windows下面執行,所以要刪除掉workerman/workerman,再進行下一步。workerman/workerman-for-win`

這時,你再啟動監聽就可以了!

本作品採用《CC 協議》,轉載必須註明作者和本文連結
溫馨提示:微信搜尋並關注   學Laravel  裡面有兩套Laravel課程:【laravel7.x 從入門到核心架構講解】 與 【Laravel高階實戰教程42集】,直接獲取就可以了

相關文章