>  기사  >  백엔드 개발  >  PHP 컬 다중 스레드 요청을 사용하여 모든 요청이 완료될 때까지 기다리지 않고 요청이 완료된 후 즉시 각 스레드가 결과를 출력하도록 만드는 방법은 무엇입니까?

PHP 컬 다중 스레드 요청을 사용하여 모든 요청이 완료될 때까지 기다리지 않고 요청이 완료된 후 즉시 각 스레드가 결과를 출력하도록 만드는 방법은 무엇입니까?

WBOY
WBOY원래의
2016-09-06 08:57:091421검색

웹사이트 루트 디렉토리에 test.html이 있고 내용은 텍스트 데모뿐입니다.

<code>    demo
</code>

curl.php입니다

<code><php?

//设置curl
$chArr=[];
for($i=0;$i<500;$i++){
    $chArr[$i]=curl_init("http://dev.site/test.html");
    curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}

//创建curl
$mh = curl_multi_init(); 
foreach($chArr as $k => $ch){
    curl_multi_add_handle($mh,$ch); 
}

$running = null;

do{
    curl_multi_exec($mh,$running); 
}while($running > 0); 

//启动多线程
foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);  

    //在这里输出内容
    echo "$result[$k]\n"      
    
    curl_multi_remove_handle($mh,$ch);
}

curl_multi_close($mh); 


</code>

동시 횟수가 500으로 설정되어 있어 약 10초 정도 기다린 후 결과가 출력되는데, 대기 시간 동안에는 프로그램이 응답하지 않습니다.
PHP 컬 다중 스레드 요청을 사용하여 모든 요청이 완료될 때까지 기다리지 않고 요청이 완료된 후 즉시 각 스레드가 결과를 출력하도록 만드는 방법은 무엇입니까?

내가 달성하고 싶은 효과는 컬 스레드 요청이 완료될 때마다 결과가 터미널에 즉시 출력될 수 있다는 것입니다: 악마.

PHP 컬 다중 스레드 요청을 사용하여 모든 요청이 완료될 때까지 기다리지 않고 요청이 완료된 후 즉시 각 스레드가 결과를 출력하도록 만드는 방법은 무엇입니까?

어떻게 구현해야 할까요? Php에서 구현할 수 없는 경우 NodeJs 및 Python 솔루션을 사용할 수 있습니다. 감사합니다

답글 내용:

웹사이트 루트 디렉토리에 test.html이 있고 내용은 텍스트 데모뿐입니다.

<code>    demo
</code>

curl.php입니다

<code><php?

//设置curl
$chArr=[];
for($i=0;$i<500;$i++){
    $chArr[$i]=curl_init("http://dev.site/test.html");
    curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}

//创建curl
$mh = curl_multi_init(); 
foreach($chArr as $k => $ch){
    curl_multi_add_handle($mh,$ch); 
}

$running = null;

do{
    curl_multi_exec($mh,$running); 
}while($running > 0); 

//启动多线程
foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);  

    //在这里输出内容
    echo "$result[$k]\n"      
    
    curl_multi_remove_handle($mh,$ch);
}

curl_multi_close($mh); 


</code>

동시 횟수가 500으로 설정되어 있어 약 10초 정도 기다린 후 결과가 출력되는데, 대기 시간 동안에는 프로그램이 응답하지 않습니다.
PHP 컬 다중 스레드 요청을 사용하여 모든 요청이 완료될 때까지 기다리지 않고 요청이 완료된 후 즉시 각 스레드가 결과를 출력하도록 만드는 방법은 무엇입니까?

내가 달성하고 싶은 효과는 컬 스레드 요청이 완료될 때마다 결과가 터미널에 즉시 출력될 수 있다는 것입니다: 악마.

PHP 컬 다중 스레드 요청을 사용하여 모든 요청이 완료될 때까지 기다리지 않고 요청이 완료된 후 즉시 각 스레드가 결과를 출력하도록 만드는 방법은 무엇입니까?

어떻게 구현해야 할까요? Php에서 구현할 수 없는 경우 NodeJs 및 Python 솔루션을 사용할 수 있습니다. 감사합니다

nodejs는 비동기식입니다

output_buffering이 꺼진 경우 ob_start() 및 ob_flush()를 사용할 수 있습니다. 기본 크기는 4k입니다. 그렇지 않으면 콘텐츠가 너무 적기 때문에 유효하지 않습니다. 브라우저를 통해 접근하는 경우에는 브라우저에 아직 버퍼가 있기 때문에 해결책이 없고, 너무 작으면 효과를 볼 수 없습니다. 다음 테스트는 명령줄에서 OK입니다. 페이지에 ini_set 권한이 없으면 php.ini로 직접 이동하여 output_buffering=0
그런데 루프는 1번 동안 500번 실행됩니다. 2초로, php5.4는 28초가 걸립니다.

<code class="php"><?php
ini_set('output_buffering', 0);
ob_start();
$chArr=[];
for($i=0;$i<500;$i++){
    $chArr[$i]=curl_init("http://dev.site/test.html");
    curl_setopt($chArr[$i],CURLOPT_RETURNTRANSFER,1);
}


$mh = curl_multi_init();
foreach($chArr as $k => $ch){
    curl_multi_add_handle($mh,$ch);
}

$running = null;

do{
    curl_multi_exec($mh,$running);
}while($running > 0);


foreach($chArr as $k => $ch){
    $result[$k]= curl_multi_getcontent($ch);
    echo "$result[$k]\n";
    ob_flush();
    flush();
    sleep(1);
    curl_multi_remove_handle($mh,$ch);
}
ob_end_flush();
curl_multi_close($mh);</code>

멀티 스레드이지만 비동기식이 아닌 동기식입니다. PHP에는 비동기식 기능이 없는 것 같습니다

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.