捂脸分享:不懂阻塞 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的方式,非科班出身就是会遇到这样的问题。。

如果有大拿有好的解决方案,欢迎分享。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

$curl->get($api. $getAddr)->response不会返回的 json 格式不对导致 null 吧

6年前 评论

$curl 是那个类呢,php标准的curl方法是同步的,不会出现你的问题;
curl 请求时如果带上 header “Connection:close” 就会变成所谓的异步(其实是不等待返回结果,直接关闭连接的方式);
所以问题是在你使用的 $curl 上;

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!