ウェブサーバー上で PHP を実行している (そして multi_curl が利用できない可能性がある) 場合、(ライブラリを使用せずに) スクリプトを並行して実行させる 1 つの方法は、localhost:80 へのソケットを開き、必要なスクリプトを手動でウェブサーバーに実行させることです。それらは、サーバーのマルチスレッドを使用して並行して実行されます。次に、ループ内ですべての結果を収集し、すべてが完了すると (または選択したタイムアウトの後)、続行します。
これは、Web ページで参照されているすべての画像のサイズを取得するスクリプトから取られたコードです。
get_img_size.php スクリプトは、1 つの画像のサイズと情報を取得します。
$sockets[] は、テストするイメージごとに 1 つのソケットを保持する配列です。
foreach($metaItems['items'] as $uCnt=>$uVal) {
$metaItem=ContentLoader::splitOneNew($metaItems,$uCnt);
$AnImage=$metaItem['url'];
$sockets[$AnImage] = fsockopen($_SERVER['HTTP_HOST'], 80, $errno, $errstr, 30);
if(!$sockets[$AnImage]) {
echo "$errstr ($errno)<br />\n";
} else {
$pathToRetriever=dirname($_SERVER['PHP_SELF']).'/tools/get_img_size.php?url='.rawurlencode($AnImage);
// echo('<div>META Retrieving '.$pathToRetriever.' on server '.$_SERVER['HTTP_HOST'].'</div>');
$out = "GET $pathToRetriever HTTP/1.1\r\n";
$out .= "Host: ".$_SERVER['HTTP_HOST']."\r\n";
$out .= "Connection: Close\r\n\r\n";
// echo($out);
fwrite($sockets[$AnImage], $out);
fflush($sockets[$AnImage]);
// echo("<div>Socket open for $AnImage...</div>");
// flush();
}
}
} else $FoundImagePaths2[]=$metaItems; // ALL of them urls belongs to us
この後、「スレッド」が機能している間、自分のビジネスを行うことができます。次に、ループで、すべての $sockets[] から読み取り、EOF のテストを続けます。この例では、コードのずっと後の部分 (各 $AnImage のループ):
if(isset($sockets[$AnImage])) {
if(feof($sockets[$AnImage])) {
if(!isset($sizes[$AnImage])) $sizes[$AnImage]='';
$sizes[$AnImage].=fgets($sockets[$AnImage], 4096);
// echo("<div>HTML $AnImage DONE.</div>");
// echo("<div>[ ".$sizes[$AnImage]." ]</div>");
// flush();
fclose($sockets[$AnImage]);
unset($sockets[$AnImage]);
$mysizes=ContentLoader::cleanResponse($sizes[$AnImage]);
// echo($sizes[$AnImage]." ");
// echo(ContentLoader::cleanResponse($sizes[$AnImage]));
if(!is_array($mysizes)) {continue;}
if($mysizes[0]>64 && $mysizes[1]>64 && ($mysizes[0]>128 || $mysizes[1]>128))
$FoundImagePaths2[]=array('kind'=>'image','url'=>$AnImage,'ext'=>$ext,'width'=>$mysizes[0],'height'=>$mysizes[1],'mime'=>$mysizes['mime']);
メモリとプロセス、および速度の点で効率的ではありませんが、1 つの画像に数秒かかる場合、20 以上の画像を含むページ全体をすべてテストするのに同じ数秒かかります。結局のところ、これはどういうわけか並列 PHP です。