웹 서버에서 PHP를 실행 중이고 (다중 경로가 사용 불가능할 수 있음) 스크립트를 병렬로 실행하는 한 가지 방법은 localhost : 80에 소켓을 열고 수동으로 웹 서버에서 스크립트를 실행하도록하는 것입니다 필요. 서버 멀티 스레딩을 사용하여 병렬로 실행됩니다. 그런 다음 루프에서 모든 결과를 수집하고 모든 결과가 완료되면 (또는 선택한 시간 초과 후) 계속 진행합니다.
이
은
get_img_size.php 스크립트는 크기와 하나 개의 이미지의 정보를 검색합니다 .. 웹 페이지에서 참조되는 모든 이미지의 크기를 검색하는 스크립트에서 가져온 코드 조각입니다.
$ 소켓 []은 테스트 할 모든 이미지에 대해 하나의 소켓을 유지하는 배열입니다. 은 "스레드"작업에 대한 이동하는 동안
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
이 후 당신이 당신의 자신의 사업을 할 수있는, 다음, 루프, 당신은 모든 $ 소켓 []에서 읽기 및 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']);
는 메모리 및 프로세스와 속도 현명 측면에서 효율적이지 않습니다,하지만 하나의 이미지가 몇 초 걸리는 경우, 20 개 이상의 이미지가있는 전체 페이지는 모두 몇 초 만에 테스트 할 수 있습니다. 그것은 결국 어떻게 든 병렬 PHP입니다.
[forking] (http://php.net/manual/en/function.pcntl-fork.php)에 대해 들어 본 적이 있습니까? – Orbling
@Orbling 그건 내가 언급 한 확장 기능이야. 그러나 나는 엑스트라를 설치하고 싶지 않고, 그것에 대해 아주 좋은 것을 듣지 못했습니다. –
포킹은 대부분의 시스템에서 기본 프로세스에서 다중 프로세스로 실행됩니다. PHP 프로그래머는 개념과주의 사항에 익숙하지 않기 때문에 사람들은 PHP에서 자주 사용하지 않습니다. PHP에는 많은 문제가 있지만주의 깊은 처리를 통해 프로세스를 분할하는 표준적이고 건전한 방법입니다. 컬을 사용하면 대부분의 경우 오버 헤드가 높지만 웹 서버를 통해 갈 수 있다는 이점이 있으므로 기계 등의 부하를 분산시킬 수 있습니다. – Orbling