我错了,
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#L185libcurl 里默认提供的 curl_multi_wait 函数实现依赖的 curl_poll 函数代码中只用 poll 或者 select 而没有 epoll:
https://github.com/curl/curl/blob/52fab72397687467650093c86e5479cb1d759042/lib/select.c#L329