常见问题

端口占用

出现类似 WARNING swSocket_bind(:483): bind(0.0.0.0:9501) failed, Error: Address already in use[98] 如下错误,可判定为端口被占用。

可以通过 lsof 命令来查询端口占用

  1. > lsof -i:9501
  2. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
  3. php 57 root 3u IPv4 1744902 0t0 TCP *:9501 (LISTEN)

可以根据返回的 pid 使用 kill 命令来关闭占用端口的相关进程

  1. > kill -9 57

也可以通过修改 easyswoole 的监听端口的方式启动 easyswoole 的服务,修改文件在dev.php(线上环境则应在produce.php)中

  1. <?php
  2. return [
  3. 'SERVER_NAME' => "EasySwoole",
  4. 'MAIN_SERVER' => [
  5. 'LISTEN_ADDRESS' => '0.0.0.0',
  6. 'PORT' => 9501, // 此处修改 easyswoole 监听端口号
  7. ...
  8. ],
  9. 'TEMP_DIR' => null,
  10. 'LOG_DIR' => null
  11. ];

然后重新启动服务,即可成功启动服务。

Socket 监听失败

  • 判断是否为端口占用所导致的监听失败,这里还是采用 lsof 命令来查看端口
  1. > lsof -i:9501
  • 1024 以下端口需要 root 权限监听,所以这里要特别注意

外网无法访问

注意:当服务成功启动后,如果外网无法访问,可以使用 telnet 客户端查看对应的端口是否开放成功,前提是首先环境得有 telnet 客户端 (具体如何安装 telnet 客户端请用户自行百度谷歌查询),检查端口开放命令如下:telnet 公网ip/内网ip 端口号,例如:telnet 192.168.0.1 9501。端口开放成功,则会立刻跳转,不成功,则会有对应的提示。用户可根据对应的提示进行判断。

  • 检查服务监听端口是否为 0.0.0.0

  • 检查防火墙是否对外开放

  1. > netstat -anp
  2. // 如果相关端口被防火墙拦截,需要放开
  3. > firewall-cmd --zone=public --add-port=9501/tcp --permanent

如果为阿里云、腾讯云等云服务器,请检查服务器安全组是否放行对应端口。同样可以使用上述注意事项的 telnet 客户端自行检查。

以上 shell 命令适用于 centos 7,其它 linux 发行版请自行查找相关命令。

请求数据时 DNS 报错

  • 原因:有时会发现在使用 SwooleMySQL、HttpClient、Redis 等客户端发送请求时,出现了 DNS 错误,类似于 DNS Lookup resolve failed... 错误,这是由于 Swoole 底层对一些 DNS 不是很友好。
  • 解决方法:建议使用阿里云公共 DNS,具体如何配置阿里云公共 DNS,请看 https://www.alidns.com/knowledge?type=SETTING_DOCS#user_linux