title: Easyswoole http服务场景问题 meta:

  • name: description content: swoole 使用常见问题
  • name: keywords content: swoole|swoole 拓展|swoole 框架|swoole如何获取客户端IP|swoole如何获取RAW_POST|swoole https

常见问题

如何获取$HTTP_RAW_POST_DATA

  1. $content = $this->request()->getBody()->__toString();
  2. $raw_array = json_decode($content, true);

如何获取客户端IP

举例,如何在控制器中获取客户端IP

  1. //真实地址
  2. $ip = ServerManager::getInstance()->getSwooleServer()->connection_info($this->request()->getSwooleRequest()->fd);
  3. var_dump($ip);
  4. //header 地址,例如经过nginx proxy后
  5. $ip2 = $this->request()->getHeaders();
  6. var_dump($ip2);

HTTP 状态码总为500

自 swoole 1.10.x2.1.x 版本起,执行http server回调中,若未执行response->end(),则全部返回500状态码

如何setCookie

调用response对象的setCookie方法即可设置cookie

  1. $this->response()->setCookie('name','value');

更多操作可看Response对象

如何自定义App名称

只需要修改composer.json的命名空间注册就行

  1. "autoload": {
  2. "psr-4": {
  3. "App\\": "Application/"
  4. }
  5. }

如何启用Https

通常建议使用Nginx 或者Lb来配置证书,将https请求解析为http 反代到swoole 如果你仅测试使用,可以在配置文件中添加和修改以下配置来启用https

  1. 'MAIN_SERVER' => [
  2. 'SOCK_TYPE' => SWOOLE_TCP | SWOOLE_SSL, // 默认是 SWOOLE_TCP
  3. 'SETTING' => [
  4. 'ssl_cert_file' => '证书路径,仅支持.pem格式',
  5. 'ssl_key_file' => '私钥路径',
  6. ]
  7. ],

DNS Lookup resolve timeout错误

该错误一般存在与 http客户端并发时产生,原因是dns效率慢,导致多线程获取dns时超时,包括不限于以下场景:

  • mysql host设置为域名形式,并且设置最小连接高于2(很难看到,一般是10才会偶尔报错)
  • HTTPClient 多个协程同时并发
  • csp并发编程 等
    ::: warning 解决方法为:
    在并发之前,预先使用Swoole\Coroutine::gethostbyname(‘www.baidu.com’); 去查询一次dns ip,swoole底层才会自动缓存该ip :::

例如:

  1. Swoole\Coroutine::gethostbyname('www.baidu.com');
  2. for ($j = 0; $j < 100; $j++) {
  3. go(function () use ($j) {
  4. for ($i = 0; $i < 1000; $i++) {
  5. $client = new Swoole\Coroutine\Http\Client('www.baidu.com',443,true);
  6. $client->get('/');
  7. if (empty($client->errMsg)){
  8. //var_dump($client->getBody());
  9. }else{
  10. var_dump($client->errMsg);
  11. }
  12. }
  13. });
  14. }