我认为这里需要一些有关cURL解决方案的代码,所以我将与我分享(它是混合使用多个源代码(如PHP手册和注释)编写的)。
它会执行一些并行的HTTP请求(位于中的域$aURLs
),并在每个请求完成后打印响应(并将响应存储在其中以$done
用于其他可能的用途)。
该代码比所需的时间更长,因为实时打印部分和多余的注释,但是可以随时编辑答案以改进它:
<?php
ini_set('output_buffering', 'off');
ini_set('zlib.output_compression', false);
ob_end_flush(); while (@ob_end_flush());
apache_setenv('no-gzip', true);
ini_set('zlib.output_compression', false);
header("Content-type: text/plain");
ini_set('implicit_flush', true);
ob_implicit_flush(true);
header('Cache-Control: no-cache');
$string=''; for($i=0;$i<1000;++$i){$string.=' ';} output($string);
function output($string){
ob_start();
echo $string;
if(ob_get_level()>0) ob_flush();
ob_end_clean();
flush();
}
function multiprint($aCurlHandles,$print=true){
global $done;
foreach($aCurlHandles as $url=>$ch){
if(!isset($done[$url])){
$html = curl_multi_getcontent($ch);
if($html){
$done[$url]=$html;
if($print) output("$html".PHP_EOL);
}
}
}
};
function full_curl_multi_exec($mh, &$still_running) {
do {
$rv = curl_multi_exec($mh, $still_running);
} while ($rv == CURLM_CALL_MULTI_PERFORM);
return $rv;
}
set_time_limit(60);
$aURLs = array("http://domain/script1.php","http://domain/script2.php");
$done=array();
$aCurlHandles = array();
$mh = curl_multi_init();
foreach ($aURLs as $id=>$url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$aCurlHandles[$url] = $ch;
curl_multi_add_handle($mh,$ch);
}
$active = null;
$mrc=full_curl_multi_exec($mh, $active);
while($active && $mrc == CURLM_OK) {
if($descriptions=curl_multi_select($mh,1) != -1) {
usleep(500);
$mrc=full_curl_multi_exec($mh, $active);
multiprint($aCurlHandles);
}
}
foreach ($aCurlHandles as $url=>$ch) {
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
?>
CURL
触发请求并从Web上获取一些数据...