PHP 请求多个 URL,除了用 curl_multi 函数,有没有效率更高的方法,感觉 curl 是 fork 进程来请求,效率感觉不是很高
|
zjsxwcSep 14, 2021
1
curl_multi 是基于 io 的 poll-select 的吧,没开多进程
https://github.com/curl/curl/blob/1b70748e862eaa4d2ae4b8e1d34bc3b47540af22/lib/multi.c#L2543 |
|
2
@zjsxwc 有没有更好的方法,现在性能卡在这里
|
|
Gunn27Sep 14, 2021
3
你是要做异步请求吗? swoole 了解一下
|
|
akagishigeruSep 14, 2021
4
`composer require spatie/async` 可以了解下
|
|
zjsxwcSep 14, 2021
5
@xiaobaiyihao epoll 事件是操作系统级别的性能了,还慢,那只有加带宽了
|
|
fkdtzSep 14, 2021
6
那必须上协程啊,PHP 可以上 swoole 或者直接用 swoft
|
|
7
|
|
zjsxwcSep 14, 2021 via Android
8
我错了,
php 的 curl multi 居然不是基于 epoll 的 虽然 libcurl 库对与 io 复用库是不可知的,可以让开发者在 c 代码里对 socket 使用自己实现的 io 复用库,但 libcurl 库也自带提供了基于 poll 与 select 的两种方式,这个方法名就有两个别名 curl_multi_wait 与 curl_multi_poll,这个具体使用 poll 还是 epoll 哪个得看 curl 的编译参数,当然性能都不能和 epoll 方式相提并论, 悲剧的是在 php 的 curl 拓展中 php 就使用了这个 curl_multi_wait 方法,而没有使用 epoll 方式相关的代码,所以 php 的 curl multi 比 epoll 慢也是正常,当然 poll 与 select 再拉垮仍旧比顺序执行快。 参考: php curl 拓展提供的 php 方法 curl_multi_select 就是直接调用 libcurl 的 curl_multi_wait 函数: https://github.com/php/php-src/blob/master/ext/curl/multi.c#L185 libcurl 里默认提供的 curl_multi_wait 函数实现依赖的 curl_poll 函数代码中只用 poll 或者 select 而没有 epoll: https://github.com/curl/curl/blob/52fab72397687467650093c86e5479cb1d759042/lib/select.c#L329 |
|
rekulasSep 14, 2021
9
原生 php 不好搞,考虑加个微服务 api 实现吧,也就半小时就撸出来了
|
|
honkkiSep 14, 2021
10
单独新写一个服务并发请求返回结果呢
|
|
ActraceSep 14, 2021
11
楼主要说一下运行环境,是 CLI 还是 CGI 。
|
|
heybuddySep 14, 2021 via iPad
12
guzzle 可以做并发请求的,好像是用协程实现的
|
|
sagaxuSep 14, 2021
13
curl_multi 是你目前最靠谱的选项,拿 Go 提炼重写服务你就多了个服务治理,引入 Swoole 解决了 1 个简单问题带来了 10 个困难问题更不靠谱
|
|
fiypigSep 14, 2021 via iPhone
14
试试 go ?
|
|
zjsxwcSep 14, 2021 via Android
15
写错:
“这个具体使用 poll 还是 epoll 哪个得看 curl 的编译参数” 需要改成 “但 libcurl 库也默认自带提供了一个基于 poll 或 select 的两种实现的方式,这个方法有两个功能一样的别名 curl_multi_wait 与 curl_multi_poll,起具体实现使用 poll 还是 select 哪个得看 curl 的编译参数” |
|
gBurnXSep 14, 2021
16
你想拿 PHP 做高性能,出发点就是错的。哪怕是用 java 撸个微服务都比 PHP 好。
|
|
17
cli 还是 fpm ?
效率低是几十万还是几千万页面需要在多久时间内请求完? 资源消耗配置有什么要求? 没指标没实践光靠感觉去评价 只能引来一堆语言党 解决不了问题 |
|
NjcyNzMzNDQ3Sep 15, 2021
18
稳定,不安扩展就 curl_muiti,我用 cli 做好资源回收,服务器 4cpu/4g 内存的机子每秒 100 请求都不耗费资源
推荐这个库 composer require chuyskywalker/rolling-curl 设置好地址、并发数,等回调就好了 其他的 phper 楼上都说了,借用#17 的话 ----- 没指标没实践光靠感觉去评价 只能引来一堆语言党 解决不了问题 |
|
star7thSep 15, 2021
19
感觉你需要异步 http 请求。试着用这个 https://github.com/star7th/htq
|
|
20
@JaguarJack 这个 fock 进程,性能更加扛不住
@Actrace php-fpm,这个可以换的倒是没大问题,就是不能换语言 @fiypig 不能换语言 @dusu fpm,性能每次请求必须在 300 ~ 400ms 内答应,百万吧,现在的情况就是卡在这个 curl_multi 请求上,本身这个接口也是高并发接口,接口内部要去并发请求其他接口 |
|
liuyibaoSep 15, 2021
21
symfony/http-client
Responses are always asynchronous, so that the call to the method returns immediately instead of waiting to receive the response: https://symfony.com/doc/current/http_client.html 用这个没错的,解析 Response 的时候才会阻塞,很好用的。 |
|
liuyibaoSep 15, 2021
22
symfony/http-client 搜了下源码,好像是用 yield 实现的,性能应该是可以的,只有 php7 以上能用。php8 增加的 fiber 会更强悍。
|
|
zjsxwcSep 15, 2021
23
@xiaobaiyihao
> "@dusu fpm,性能每次请求必须在 300 ~ 400ms 内答应,百万吧,现在的情况就是卡在这个 curl_multi 请求上,> 本身这个接口也是高并发接口,接口内部要去并发请求其他接口" 300 ~ 400ms 内 百万请求,用什么 php 啊, 你带宽都要 2.5Gbps 了 |
|
zjsxwcSep 15, 2021
24
@xiaobaiyihao
> "@dusu fpm,性能每次请求必须在 300 ~ 400ms 内答应,百万吧,现在的情况就是卡在这个 curl_multi 请求上,> 本身这个接口也是高并发接口,接口内部要去并发请求其他接口" 300 ~ 400ms 内 百万请求,用什么 php 啊, 你带宽都要 6Gbps 了 |
|
25
@zjsxwc 现在就是怼机器来着,想办法优化
|
|
26
@liuyibao 这个好像不支持 protobuf
|
|
27
@zjsxwc 而且这是要求,现在就是达不到这种情况
|
|
ActraceSep 15, 2021
28
@xiaobaiyihao 更换到 CLI 下会有更多选择。PHP 内置了不少多线程,事件库,甚至可以用协程。可以单独写成一个服务,驻后台运行。
|