> 백엔드 개발 > PHP 튜토리얼 > php curl_multi_exec 官网例子里面为啥有两次 do while

php curl_multi_exec 官网例子里面为啥有两次 do while

WBOY
풀어 주다: 2016-06-06 20:06:52
원래의
991명이 탐색했습니다.

感觉很难用啊,且这个例子在5.5下还跑不通(下面的 User Contributed Notes 里有人提供了解决方案)

<code><?php // 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建批处理cURL句柄
$mh = curl_multi_init();

// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
// 执行批处理句柄
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
</code></code>
로그인 후 복사
로그인 후 복사

其中这一部分,谁能帮忙解释一下,用法也太怪了吧!

<code>do {
    $mrc = curl_multi_exec($mh, $active);//位置1
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);//位置2
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}</code>
로그인 후 복사
로그인 후 복사

官网对 curl_multi_select 的解释:“阻塞直到cURL批处理连接中有活动连接。”没有事件机制所以不断循环去判断是否不等于-1?!判断成功之后,为啥又执行了一次$mrc = curl_multi_exec($mh, $active);//位置2

这个写法好奇怪啊,有三个while...

User Contributed Notes 里面有人提出如下代码,测试发现可以跑通,但是为啥要循环执行curl_multi_exec,按理说这个方法不是执行一次就好了么...

<code>do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);</code>
로그인 후 복사
로그인 후 복사

回复内容:

感觉很难用啊,且这个例子在5.5下还跑不通(下面的 User Contributed Notes 里有人提供了解决方案)

<code><?php // 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();

// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

// 创建批处理cURL句柄
$mh = curl_multi_init();

// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
// 执行批处理句柄
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}

// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
</code></code>
로그인 후 복사
로그인 후 복사

其中这一部分,谁能帮忙解释一下,用法也太怪了吧!

<code>do {
    $mrc = curl_multi_exec($mh, $active);//位置1
} while ($mrc == CURLM_CALL_MULTI_PERFORM);

while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);//位置2
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}</code>
로그인 후 복사
로그인 후 복사

官网对 curl_multi_select 的解释:“阻塞直到cURL批处理连接中有活动连接。”没有事件机制所以不断循环去判断是否不等于-1?!判断成功之后,为啥又执行了一次$mrc = curl_multi_exec($mh, $active);//位置2

这个写法好奇怪啊,有三个while...

User Contributed Notes 里面有人提出如下代码,测试发现可以跑通,但是为啥要循环执行curl_multi_exec,按理说这个方法不是执行一次就好了么...

<code>do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);</code>
로그인 후 복사
로그인 후 복사

效率不同。
官方的demo通过

<code class="php">do {
    $mrc = curl_multi_exec($mh, $active);//位置1
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
</code>
로그인 후 복사

去循环,去确保所有进程都被开始执行了。
然后进入第二个嵌套循环。循环去获取还没返回完数据的进程。直到所有的都完成了。

<code class="php">do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);</code>
로그인 후 복사

肯定是可以执行的,只不过你这种如果有一个进程超时,或者很慢,每次循环会拉所有进程一次的,内存和cpu的开销自然很大。。

实现方式不唯一。还有很多人优化到极致的,都可以试试,要根据自己代码的逻辑和业务情况去判断。要怎么优化

관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿