摘要:第一个负责清除缓存。我们阻塞住剩下程序的执行直到网络的结束。是之前调用方法产生的句柄,和都是整型的值。把设为正在处理的句柄个数。所有这些表明我们需要停止处理。手册对这些东西的细节有稍微的介绍,但是的文档更加的完整。
本文是PHP and curl_multi_exec的翻译
这篇文章阐述了如何从curl_multi句柄获取数据。不久前,我将这段代码片段贴到了一个更大的示例代码中:
我之前没有真的去查过文档试图理解过它。所以这段代码让我感到困惑。现在我来解释下它都做了什么。
首先,这里有两个外层的循环。第一个负责清除curl缓存。第二个负责等待更多的数据,并且获取到这些数据。这就是一个典型的阻塞I/O例子。我们阻塞住剩下程序的执行直到网络I/O的结束。尽管这不是处理网络I/O最合适的方法,但对于单进程、同步的PHP,这实际上是我们仅有的选择。
让我们先来看下第一层循环:
curl_multi_exec尝试从multi句柄中获取写数据。$multi是之前调用curl_multi_init()方法产生的句柄,$active和$ret都是整型的值。
curl_multi_exec()把$active设为正在处理的句柄个数。换句话说,如果你正在用这个句柄请求5个URL,那么curl_multi_exec将返回5当它正在处理所有的5个URL(应该是指curl_multi_exec设$active为5),然后当每个请求结束时,这个数字将会逐渐减少直到0。
$ret是如下值的一种:
CURLM_CALL_MULTI_PERFORM (-1):这意味着你需要再次调用curl_multi_exec(),因为仍有数据可供处理。
CURLM_OK(0):如文档中所说:“都好了”。这意味着可能有更多的数据,但还没有到呢。
错误码中的一个:CURLM_BAD_HANDLE ,CURLM_OUT_OF_MEMORY ,CURLM_INTERNAL_ERROR ,CURLM_BAD_SOCKET 。所有这些表明我们需要停止处理。
所以当我们正在执行第一层循环,唯一需要我们继续迭代的情况就是CURLM_CALL_MULTI_PERFORM。
现在,对于一些相当小的情况,第一层循环就是你所需要的。然而通常的情况是,第一层循环会返回CURL_OK来表明还会有更多的数据,但是这些数据还没有在网络上传输过来呢。
我们需要wait。
这时候我们就需要第二层循环:
这层循环是说...
(while): 只要有活跃的连接,一切还看着都OK… (if) 如果网络socket还有些数据… (do/while) 只要系统告诉我们要一直去获取数据,我们就处理吧
所以第二层循环负责检查套接字直到一切就绪。
PHP手册对这些东西的细节有稍微的介绍,但是libcurl C的文档更加的完整。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28376.html
摘要:普通请求创建多个资源并发创建多个资源创建批处理句柄增加句柄待优化点在执行而整个批处理句柄没有全部执行完毕时,系统会不停地执行函数。进行改动的方式是应用函数库中的函数,其函数原型如下阻塞直到批处理连接中有活动连接。 普通请求 curl_normal.php use time:0.830 s curl_multi并发 curl_multi.php use time:0.259 s ...
摘要:不支持多线程模式和回调处理,因此内部脚本都是同步阻塞式的,如果你发起一个的请求,那么程序就会阻塞,直到请求返回结果,才会继续执行代码。参考资料手册手册预定义常量中实现多线程请求详解每次使用同时并发多少请求合适简书多线程及原理 后端服务开发中经常会有并发请求的需求,比如你需要获取10家供应商的带宽数据(每个都提供不同的url),然后返回一个整合后的数据,你会怎么做呢? 在PHP中,最直观...
摘要:说明这里用到的项目都是基于的项目。但同时,它和其他的分布式文件系统的区别也是很明显的。能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。放宽了一部分约束,来实现流式读取文件系统数据的目的。是项目的一部分。 关键词 Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的...
摘要:说明这里用到的项目都是基于的项目。但同时,它和其他的分布式文件系统的区别也是很明显的。能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。放宽了一部分约束,来实现流式读取文件系统数据的目的。是项目的一部分。 关键词 Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的...
摘要:根据获取请求对象这个比较简单可以看官方文档将三个待请求对象放入下载器中轮询一旦有一个请求完成,找出来,处理因为底层是,所以最大受限于从请求中获取信息内容错误把请求已经完成了得删除当没有数据的时候进行堵塞,把使用权交出来,避免上面死循环空跑数 class CurlMultiUtil { /** * 根据url,postData获取curl请求对象,这个比较简单,可以看官方...
阅读 25604·2021-09-29 09:41
阅读 4672·2021-09-10 11:20
阅读 1880·2021-09-09 09:32
阅读 1861·2019-08-30 15:44
阅读 3172·2019-08-29 17:13
阅读 2782·2019-08-29 14:14
阅读 2005·2019-08-29 14:11
阅读 3207·2019-08-29 12:36