接口开发是否有必要在调用接口的时候每次都重新 new GuzzleClient()
下面这 2 个有区别吗
- 先
new GuzzleClient
创建实例每次调用同一平台接口都用这个, 我记得 new class 是有性能消耗的,貌似也不大。 - 每次请求都
new GuzzleClient
, 每次请求都不影响结果,每次都需要组装options
参数
你们用那种嘞? 有区别吗
目的:谋求更优雅的代码
我一般这样
$client = new CLient($options);
$client->request();
$client->request();
我记不得多次请求是否会有影响了,如果有就
$client = new CLient($options);
(clone $client)->request();
(clone $client)->request();
类的实例化确实是会消耗性能,所有才有单例模式,我是直接用Http Facade。
工厂模式的目的,尽可能保证类实例化的独立性,避免单例模式因为上下文带来的影响。
都用php就别纠结这个性能了
两种方式,
1是直接使用单例,
2是使用laravel容器托管。
使用方式是
第二种方式,就是用laravel的
app
函数这个函数就是创建一个单例全局托管的。
他的源码是
当然我其实觉得这些还都算小问题,主要是client的封装是否便于业务使用。我的一个client大概这样。
有reset 就用单例,没有,为了不影响上下文就每次都new
代码性能消耗是其次,并发高的话频繁new Client 会有连接数的问题
越来越神了……你们都是啥业务啊,还 new 实例的损耗都来了,且不说随便一个类实例化,正常场景下就算 new Client 又能有多大的开销来的。
还有那个 new Client 影响连接数的,真看过 Client 里面的实现嘛,连接又不是凭空建立来的……
不过对于 FPM 模式而言,对外部的 HTTP 的请求,连接确实比较耗时,但是这跟 new Client 无关。
一个好消息是 PHP 团队在前不久刚投票通过接受(Accepted)了一个 RFC,在下一个的小版本(minor)中将新增一个
curl_share_init(?array $share_options, ?string $persistent_id)
来共享 curl 句柄,从而避免 FPM 下 cURL 的连接浪费(现在就有这个 curl_share_init 函数,这次的 RFC 是增强)。有点吹毛求疵了
GuzzleClient 是线程安全的,并且设计上是允许被多次使用的。
生产项目实测,区别确实很大的,在qps2W的情况下, 复用实列之后cpu下降很多