ihipop

Results 78 comments of ihipop

设备型号: | HG8245 -- | -- 描述: | EchoLife HG8245 EPON E8-C Terminal (PX20+) 硬件版本: | 130C4500 软件版本: | V1R003C00S207 版本发布时间: | 2015-02-13_15:30:04 ONT注册状态: | 已注册,已授权。

any update?

according to this table `44` permits print and copy according to this table | Bit\POS | 12 | 11 | 10 | 9 | 8 | 7 | 6 |...

I turned off the validation to bypass the problem

另外 现有的PSR实现其实不符合PSR标准。按照PSR message的标准,所有的PSR的Request都应该是只读的,也就是说 `$requestNew=$request->withBody(...)`, `$requestNew` 是`withBody`执行后的结果,`$request`是之前的结果 https://www.php-fig.org/psr/psr-7/ ![image](https://user-images.githubusercontent.com/423077/55772397-9e70f600-5abe-11e9-83bd-f3d17d1dde14.png)

我的意思也不是让你去做一个guzzle handler,因为确实很多强Swoole相关的东西。 说一下我实际生产上遇到的问题和需求吧: - 我本身做一了个Composer扩展(以下简称`扩展`),需要依赖HTTPS?客户端做外部交互 - 为了协程兼容、传统兼容或者更大的灵活性,我肯定不愿意绑定到具体的某个客户端上,包括Guzzle或者简单实现的Curl或者Saber - 为了方便的绑定客户端,我在这个`扩展`内部实现了一个简单的DI容器,用来注入管理所需要的客户端或者依赖,当用于协程环境的的时候,扩展在协程内调用是直接传递新建的DI对象实现的,一个DI实例Application代表了这个扩展的所有可调用子实例或者依赖,从而实现协程间`扩展`客户端的隔离。通过简单配置 我就可以决定自己到底是用什么客户端来发送请求。 - 于是我的`扩展`设计上是把需要发送的请求用PSR7的RequestInterface描述所有请求内容,然后用支持PSR的HTTP客户端发送这个请求,这方面,Guzzle的设计是,他的Request对象本身就是PSR兼容的,这样,当我需要使用Guzzle做客户端的时候,我只要在配置DI里面注入Guuzle客户端实例,只简单写一下Guzzle的发送和异常处理,就可以发送这个Request。 - 问题到Saber上,就是Saber的Request不是完全PSR兼容的,其发送是Request自己发送。导致我生成的描述请求的PSR Rquest是没法简单的交给Saber发送的,只能自己把请求拆开再组装成Saber自己的Request - 希望将来设计的时候,把Request和具体的发送请求拆开。Guzzle曾经有很多批评说过度封装,但是从现在看,有些设计还是很有必要的。现在Guzzle可以很简单的用自己快捷的语法组装发送请求,也可以用PSR的方式发送请求。 - PSR的RequestInterface是否只读得看你个人设计需要,我倒是觉得,这都小问题,只读变成非只读不影响功能,因为遵守只读规范的话,就算你是可读写的,按照只读的用法也不会出错,反而PSR兼容是要紧一点

二:客户端重用长连接 现在的文档里面说客户端会自动复用长连接,看了代码确实对同目的地同端口的服务器都做了连接池,但是,实测如果走PSR方式,客户端并不复用长连接,连接不停的出现SYN_SENT、ESTABLISHED、LocalPort的状态切换。 如下是PSR Request转换代码,测试服务器是 http://httpbin.org/anything ![image](https://user-images.githubusercontent.com/423077/55944162-8e057a80-5c7a-11e9-85d5-15f5ec383290.png) 动图: ![深度录屏_选择区域_20190411165555](https://user-images.githubusercontent.com/423077/55944239-c4db9080-5c7a-11e9-90b3-c97f512260f5.gif)

@twose 你是对的,以为和Guzzle一样 单一实例会自动复用长连接,看了你代码你是和池绑定到了一起,只有开启池的时候才会使用长连接,否则就算重复请求同一个服务器也不会使用长连接。 当初是基于什么考虑要和池绑定到一起呢?单一客户端多次请求同一个服务端口也可以长连接啊?

@twose 但是文档里面 Keepalive默认也是true,并没有说明 use pool以后keepalive才会生效 ![image](https://user-images.githubusercontent.com/423077/56006622-27c73900-5d08-11e9-8c9f-679c64a2b8fc.png) 而且我看了代码,用PSR()方法是生成了一个默认客户端,应该来说这个客户端默认就应该支持长连接

生成的PSR对象打印 `var_export($psr->getKeepAlive());` 结果也是true的 但是如果不开启池,就不是长连接 这里应该是有问题 具体的问题代码如下: https://github.com/swlib/saber/blob/5cd11340e39c335e3fc6f8fee38ebdbe16b57def/src/Request.php#L504-L516 这这判断如果本request不和某个client关联,就检查连接池设置,如果没开启池,就始终创建新连接。这样就算默认的Request设置了keepalive是true,也会导致因为客户端每次都是新建的,不使用长连接。这与文档描述行为:长连接默认开启不符。