workermanの起動失敗
現象1
起動後、以下のようなエラーが表示される:
php start.php start
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (Address already in use) in ...workerman/Worker.php on line xxxx
キーワード: Address already in use
根本原因: ポートが占有されているため、起動できません。
解決策1
コマンドnetstat -anp | grep ポート番号を使用して、どのプログラムがポートを占有しているかを特定できます。
その後、該当するプログラムを停止してポートを解放します。
解決策2
該当ポートのプログラムを停止できない場合は、workermanのポートを変更することで解決できます。
解決策3
Workermanが使用しているポートが占有されていて、stopコマンドで停止できない場合(一般的にはpidファイルの喪失や、主プロセスが開発者によってkillされたことが原因)、以下の2つのコマンドを実行してWorkermanプロセスを強制終了できます。
killall php
ps aux|grep -i workerman|awk '{print $2}'|xargs kill -9
解決策4
実際にこのポートをリッスンしているプログラムがなければ、開発者がworkermanで2つ以上のリッスンを設定しており、同じポートでリッスンしている可能性があります。開発者自身が起動スクリプトで同じポートをリッスンしていないか確認してください。
解決策5
プログラムがreusePortを有効にしているか確認し、reusePortを無効にして試してみてください。
現象2
起動後、以下のようなエラーが表示される:
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxx (Cannot assign requested address) in ...workerman/Worker.php on line xxxx
または
PHP Warning: stream_socket_server(): unable to connect to tcp://xx.xx.xx.xx:xxxx (そのコンテキスト内で要求されたアドレスが無効です) in ...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ユーザーでサービスを起動してください。