可以,但需配合curl_multi_select实现真正并发;直接while(curl_multi_exec())会卡死,因缺少socket就绪等待;并发受超时设置、系统限制、服务器反爬及PHP单进程影响;高并发建议用Swoole协程或amphp。
curl_multi_exec 能否真正并发请求?
可以,但不是“开箱即用”的并发——curl_multi_exec 本身不自动并行,它只是把多个 cURL 句柄交给底层 libcurl 批量轮询处理,是否并发取决于你是否配合 curl_multi_select + 循环等待,否则容易卡死或退化成串行。
为什么直接 while(curl_multi_exec()) 会卡住?
常见错误是写成:
while (curl_multi_exec($mh, $active) === CURLM_CALL_MULTI_PERFORM);
这种写法只适用于“立即完成”的极少数情况;绝大多数 HTTP 请求需要等待 socket 就绪,而 CURLM_CALL_MULTI_PERFORM 已被弃用(PHP 7.5+ 报警告),且无法触发真正的异步等待。
正确做法是:用 curl_multi_select 阻塞等待任意句柄就绪,再调用 curl_multi_exec 处理已就绪的请求:
-
curl_multi_select返回 >0 表示有 socket 可读/可写,此时再curl_multi_exec - 返回 0 表示超时(需设合理 timeout,如 1 秒),应检查是否还有活跃句柄
- 返回 -1 表示 select 失败(如无可用 socket),通常可重试或 break
实际并发数受哪些因素限制?
并发能力不只看代码逻辑,还卡在这些地方: