这篇文章是PHP和curl_multi_exec的翻译这篇文章解释了如何从一个curl_multi句柄中获取数据。我刚才将这段代码片段发布到一个更大的示例代码中:我之前并没有真正检查过文档来尝试理解它。所以这段代码让我很困惑。现在让我解释一下它的作用。首先,有两个外环。第一个负责清除curl缓存。第二个负责等待更多数据并获取它。这是阻塞I/O的典型示例。我们阻止程序其余部分的执行,直到网络I/O完成。虽然这不是处理网络I/O的最合适方式,但对于单进程、同步PHP,它确实是我们唯一的选择。我们先看第一层循环:curl_multi_exec尝试从multihandle中获取写入数据。$multi是之前调用curl_multi_init()方法生成的句柄,$active和$ret都是整数值.curl_multi_exec()将$active设置为正在处理的句柄数。也就是说,如果你是用这个handle请求5个url,那么curl_multi_exec在处理所有5个url的时候会返回5(应该是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以指示还有更多数据,但该数据尚未通过网络传输。我们需要等待。这时候我们就需要第二次循环了:积极的);}while($mrc==CURLM_CALL_MULTI_PERFORM);}}?>这个循环意味着...(while):只要有活动连接,一切看起来都OK...(if)如果网络套接字仍然有一些数据...(do/while)只要当系统告诉我们继续获取数据时,让我们开始吧。所以第二个循环负责检查套接字,直到一切准备就绪。PHP手册对这些内容进行了一些详细介绍,但libcurlC文档更为完整。
