文章來自:微信公眾號-PHP自學中心
個人筆記:在workerman
開發過程中,遇到了很多問題,我都總結了一下,與大家分享。如果你在實戰中有不懂的,建議去看看這套教程,希望能幫助到你!
ThinkPHP5與workerman實戰—線上客服
連結:www.mano100.cn/thread-158-1-1.html
workerman
無法正常訪問
問題描述:在阿里雲ECS上部署了workerman
的應用(ECS
是專有網路),在ECS
安全組裡已經允許workerman
需要的全部埠,但是外網一直不能正常開啟(注,其他服務,比80埠外部是可以用訪問的)。telnet
連線顯示“No route to host
”,而且我是關閉了centos7
的firewalld
防火牆的,這讓我很困惑。
問題原因:
因為對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
debug
和daemon
方式區別:
1、以debug
方式啟動,程式碼中echo
、var_dump
、print
等列印函式會直接輸出在終端。
2、以daemon
方式啟動,程式碼中echo
、var_dump
、print
等列印會預設重定向到/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 協議》,轉載必須註明作者和本文連結