2012-11-26 2 views
1

some.txt 파일을 가져 와서 링크를 읽고 내 웹 사이트 백 링크가 있는지 여부를 확인하는 스크립트가 있습니다. 그러나 문제는 매우 느리고 속도를 높이고 싶습니다. 속도를 높이는 방법이 있습니까?내 스크립트의 속도 향상

<?php 
ini_set('max_execution_time', 3000); 
$source = file_get_contents("your-backlinks.txt"); 
$needle = "http://www.submitage.com"; //without http as I have imploded the http later in the script 
$new = explode("\n",$source); 
foreach ($new as $check) { 
$a = file_get_contents(trim($check)); 
if (strpos($a,$needle)) { 
$found[] = $check; 
    } else { 
    $notfound[] = $check; 
      } 
         } 
echo "Matches that were found: \n ".implode("\n",$found)."\n"; 
echo "Matches that were not found \n". implode("\n",$notfound); 
?> 
+0

아니, 당신이 통제 할 수없는 통해 네트워크에 따라 달라집니다. –

+0

@ N.B. 맞다. 가장 큰 문제는 네트워크이지만 strpos를 사용하는 것이 다른 해결책 일 수 있습니다. 전체 문자열을 분할하는 대신 반환 된 콘텐츠에서 도메인의 위치를 ​​간단히 확인할 수 있습니다. 수사를해야 할 수도 있지만 시도해 볼 가치가 있습니까? – Gavin

+0

비동기 HTTP를 사용해야합니다. 그러나, 나는 PHP에서 그것을하는 방법에 대한 좋은 소스를 찾을 수 없습니다. –

답변

0

당신은 어쩌면 일부 가짜 멀티 스레딩 솔루션을 제외하고는 PHP를 최적화하여 동작에서 더 이상 속도를 짜내 할 수 없습니다.

그러나이 검사를 백그라운드 작업으로 실행할 수있는 대기열 시스템을 만들 수 있습니다. URL을 반복하면서 URL을 확인하는 대신 대기열에 URL을 추가하십시오. 그런 다음 대기열에서 확인되지 않은 URL을 하나씩 가져 와서 도메인에 대한 참조가 있는지 확인하고 결과를 저장하는 cron 스크립트를 작성하십시오.

2

가장 큰 병목은 HTTP 요청을 병렬로가 아니라 순차적으로 실행한다는 것입니다. curl은 여러 요청을 동시에 수행 할 수 있습니다. the documentation의 예제는 루프를 사용하고 실제로 결과를 수집하는 데 많이 사용됩니다. 나는 그것이 맞습니다 장담 할 수 없어, 난 단지 내가 제대로 설명서를 따랐습니다 약속 :

$mh = curl_multi_init(); 
$handles = array(); 

foreach($new as $check){ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $check); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_multi_add_handle($mh,$ch); 
    $handles[$check]=$ch; 
} 

// verbatim from the demo 
$active = null; 
//execute the handles 
do { 
    $mrc = curl_multi_exec($mh, $active); 
} while ($mrc == CURLM_CALL_MULTI_PERFORM); 

while ($active && $mrc == CURLM_OK) { 
    if (curl_multi_select($mh) != -1) { 
     do { 
      $mrc = curl_multi_exec($mh, $active); 
     } while ($mrc == CURLM_CALL_MULTI_PERFORM); 
    } 
} 
// end of verbatim code 

for($handles as $check => $ch){ 
    $a = curl_multi_getcontent($ch) 
    ... 
}