2017-10-11 17 views
0

나는 현재 을 사용하는 스크립트를 사용하여 사용자가 페이지를 방문 할 때마다 약 3000 개의 이미지 파일 크기를 확인합니다. 이는 내용이 변경 될 때마다 발생하기 때문입니다.PHP는 원격 이미지 파일 크기를 약 3000 번 확인하기 위해 컬링보다 빠릅니다.

7442 바이트의 크기와 일치하면 이미지의 경로가 변경되고 그렇지 않으면 원본을 유지합니다.

이미지 URL은 $ variable, mysql 및 원격 xml 파일과 로컬 xml 파일에 저장됩니다. 그러나 이미지 iself는 항상 원격으로 저장됩니다.

$image = 'http://remoteserver.com/user22.jpg'; 
//Check if all thumbs are ok real and available 
$ch = curl_init($image); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 
curl_setopt($ch, CURLOPT_HEADER, TRUE); 
curl_setopt($ch, CURLOPT_NOBODY, TRUE); 

$data = curl_exec($ch); 
$size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD); 
curl_close($ch); 
if($size == 7442){ 
    echo '<img src="https://www.newdomain.com/tmp.jpg" height="190.11"/></a>'; 
} else { 
    echo '<img src="' . $image . '" alt="' . $user . '" /></a>'; 
} 

활성화되면 페이지를로드하는 데 약 40 초가 걸리고 주석 처리가 완료되면 3 초가 걸립니다. 그러나 모든 사용자가 웹 페이지를 방문 할 때마다 실행되거나, mysql에 데이터를 추가하고 mysql에서 주소를 변경하기 전에 컬을 실행하면 해당 정보가 mysql에로드되어 모든 이미지가 표시되지 않습니다.

이 체크, 서버 응답 시간, PHP 설정 등에 따라 많은 것들이 있습니다.하지만이 이미지 파일 검사가 실제로 필요하며 40 초의로드 시간을 가질 여유가 없습니다 사용자가 페이지를 방문 할 때마다

의견이나 도움이 필요하십니까? 감사합니다.

+3

웹 요청의 일부가 아닌 백그라운드 프로세스로 실행하십시오. –

+1

memcache 또는 무언가를 사용하여 이미지 URL 재 라우팅 집합을 저장할 수 있습니다. 예약 된 백그라운드 서비스 (PHP 스크립트)가 주기적으로 실행되어 파일 크기를 확인하고 다시 라우팅 된 URL을 memcache에 추가 할 수 있습니다. memcache를 검색하고 발견 된 키를 반환하거나 그렇지 않은 경우 원본 URL을 반환하는 함수의 이미지 URL을 얻습니다. – jcorry

+0

Mark Baker와 Jcorry에게 감사드립니다. 원래의 url은 실제로는 mysql에 저장되지만 url 만, 크기 정보는 저장되지 않습니다. 그건 memcache의 필요성을 없애 줍니까? –

답변

0

다른 사람들이 의견에서 제안한 것처럼, 파일 크기를 확인하고 페이지 요청과 완전히 별개로 mysql을 업데이트하기위한 백그라운드 프로세스를 만듭니다. 여러 사용자가 동일한 이미지를 요청하면 훨씬 효율적입니다.

그러나 실제로 페이지로드시 완료해야하는 경우 더 나은 사용자 환경을위한 또 다른 옵션은 브라우저에서 확인하는 것입니다. 저장된 이미지 경로가있는 페이지를로드 한 다음 JS를 사용하여 파일 크기를 요청하고 필요에 따라 이미지 경로를 변경하십시오. 예 :

var images = document.getElementsByTagName('img'); 
for(var i = 0; i < images.length; i++) { 
    var xhr = new XMLHttpRequest(); 
    xhr.open("HEAD", images[i].src, true); 
    xhr.onreadystatechange = function() { 
     if (this.readyState == this.DONE) { 
      if (parseInt(xhr.getResponseHeader("Content-Length"))) === 7442) { 
       images[i].src = 'https://www...'; // New path 
      } 
     } 
    }; 
    xhr.send(); 
} 

은 (테스트되지 않은,하지만 당신은 아이디어. another SO answer에서 적응을 얻을.)이 필요한 모든 경우의 MySQL을 업데이트하는 웹 응용 프로그램에 하나의 AJAX POST를 할 수 끝났어 그리고

합니다. 또한 이미지를 호스팅하는 서버에 많은 동시 요청을 시도하므로 성능에 영향을 미칠 수 있습니다.

+0

매트 덕분에, Javascript/Ajax로 시도해 볼 것입니다. 컬링으로 인해 모든 것이 멈춰있는 것처럼 보이기 때문에 최상의 옵션 일 수 있습니다. 뭔가를 말할 것입니다. –