웹사이트 루트 디렉토리에 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에서 구현할 수 없는 경우 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에서 구현할 수 없는 경우 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에는 비동기식 기능이 없는 것 같습니다