捂脸分享:不懂阻塞 I/O 才问了 for 循环与 curl 的问题
前段时间我在问答区问了一个问题:curl 和 for 循环怎么更好的使用?curl 是同步执行?
非科班出身的还是菜鸟前端的我,天真的以为PHP同步执行就是阻塞,只有完成操作后才进入下一步,所以我认为curl是同步的,就算在for循环内也是如此
for ($i=1; $i<=200; $i++) {
$getAddr = User::findOrFail($i)->getAddresses()->where('type', 'b')->first()->address;
$res = json_decode($curl->get($api. $getAddr)->response);
var_dump($res);
}
事实上,这个代码事不对的,因为返回的数据有可能是null值,为啥呢?最近看了操作系统的内核的文章,同步并不是阻塞I/O这么简单。。
内核层为了CPU的利用率使用的是非阻塞IO,当我们执行类似文件读存的时候,非阻塞的性质调用之后会立即返回,当然就会造成读不到东西就被返回了,解决这个问题的方式就是加一个轮询判断,当获取到想要的数据才返回。
懂了这个简单的道理之后就判断 $res
值是不是想要的那个值就可以了。
我看文章说,这个叫做read,也是最原始的方式。。因为浪费资源,还有select以及poll、epoll的方式,非科班出身就是会遇到这样的问题。。
如果有大拿有好的解决方案,欢迎分享。
$curl->get($api. $getAddr)->response
不会返回的 json 格式不对导致 null 吧不明觉厉
$curl 是那个类呢,php标准的curl方法是同步的,不会出现你的问题;
curl 请求时如果带上 header “Connection:close” 就会变成所谓的异步(其实是不等待返回结果,直接关闭连接的方式);
所以问题是在你使用的 $curl 上;