2012-03-21 2 views
2

여기에 가능한 한 자세히 설명하려고합니다.PHP/AJAX/JSON/jQuery를 통해로드 된 동적 이미지 캐싱

관리자가 폴더를 만들고 해당 폴더에 사진을 업로드 할 수 있습니다. 디스플레이는 Pinterest의 디스플레이와 유사합니다. Pinterest는 한 화면에 콜라주의 모든 사진을로드합니다. 거기에 5-6 장의 사진 만 있으면 완벽하게 작동하지만 거의 작동하지 않습니다. 일단 더 많은 사진을 찍기 시작하면 더 느리게 시작됩니다. 다른 하나는 그림을 삭제하거나 해당 폴더를 다시 입력 할 때마다 전체 디스플레이가 다시로드되어야한다는 것입니다. 이러한 이미지를 캐싱 할 방법이 필요합니다. homepageActions.jsfileManager.js :

dashboard.php에서 두 개의 자바 스크립트가 포함되어 있습니다 : 여기

내 스크립트의 논리이다. homepageActions.js에는 document.ready() 스크립트가 있으며이 스크립트는 자바 스크립트 함수 showFiles()을 호출합니다.

기본적으로 문서가로드 되 자마자 조금 더 간결하게하려면 showFiles() 함수가 호출됩니다. 그 함수는 다음과 같습니다 :

function showFiles(directoryName) { 
    $.ajax({ 
    url: 'displayRecords.php', 
    type: 'post', 
    data: ({directoryName:directoryName}), 
    dataType: 'json', 
    success: function(data) { 
     constructTable(data); 
     $(document).find("a[rel*='lightbox']").lightBox(); 
    } 
    }); 
} 

이 함수에는 폴더 경로가 전달됩니다. 그곳에서 AJAX 스크립트는 해당 폴더를 찾는 PHP 스크립트를 호출하고 해당 폴더의 모든 디렉토리와 이미지 목록을 가져옵니다. 그런 다음 원래 전달 된 폴더의 각 하위 폴더와 이미지의 세부 정보가 들어있는 JSON 문자열을 구성합니다. 스크립트가 성공적으로 반환되면 JSON 문자열을 함수에 전달하는 constructTable(data)이라는 다른 함수가 호출됩니다.

여기에 약간 털이 많습니다.

constructTable() 함수에는 약 240 줄의 코드가 있으며 여기에는 포함되지 않으므로 따르기가 어렵습니다. 요약하자면이 함수는 JSON 문자열을 파싱하여 어떤 항목이 디렉토리이고 어떤 항목이 파일인지를 계산합니다. 그것은 두 개의 배열을 만듭니다 : 폴더의 배열과 파일의 배열.

먼저 모든 폴더를 처리하고 적절하게 표시합니다. 이 부분은 괜찮 았고 걱정이 없습니다.

그러나 그 후에는 이미지를 살펴보기 시작합니다. 각 이미지에 대해 기본적으로 많은 코드를 작성하고 있습니다. 각 이미지를 둘러싼 div, 링크 및 기타 HTML 마크 업이 있습니다. 그러나 짧게 말하면 간단히 말해서 각 파일 경로 (JSON에서 수집 한)를 보는 for ... next 루프가 있으며, HTML의 긴 문자열을 구성한 다음 jQuery를 사용하여 DIV에 추가합니다. 그것은 궁극적 이런 걸보고 끝나는 그래서 : 이제

for (var a = 0; a < numPhotos; a++) { 
    photoCode += "<div id='outside-container-"+a+"'>"; 
    photoCode += "<a rel='lightbox' class='photo-link' href='"++"'>"; 
    photoCode += "<img src='http://" + rootURL + "/uploads/"+fileNameArray[a] + "' width='200' class='photo-thumb'/></a>"; 
    photoCode += "</div>"; 

    $("#column1").append(photoCode); 
} 

을 - 나는 이전에 폴더에있는 사진 만 몇이있을 때, 말했듯이, 이것은 문제가되지 않습니다. 그러나 우리가 더 높은 숫자로 들어가기 시작하면 문제가됩니다. 그래서 - 그런 말로,이 사진을 브라우저 캐시에 저장할 수있는 방법이 있습니까? 그래서 초기로드 후에 훨씬 빨리로드됩니다.

+0

은 느려지거나 이미지가로드되는 javascript 프로세스입니까? –

+0

@ Rafael - 나는 그것이 느린 과정 인 것처럼 느낍니다. 예를 들어 폴더를 클릭하면 사진 디스플레이를로드하기 위해 사진을 하나씩로드해야합니다. 사진이 바로 거기에서 팝니다. 그래서 나는 느린 사진로드 진행을보고있는 것처럼 아니지만 ... 다시, 100 장의 사진을로드 할 때까지 기다리고 있습니다. 각각 약 1 초가 걸리는 것이 바람직하지 않습니다. 나는 약간 다른 접근 방식으로, 그리고 대시 보드에서 고려할 것입니다.PHP 파일, 몇 백개의 빈 이미지 태그를 만든 다음 js를 통해 src 속성을 채 웁니다. 그러나 이것이 최선의 방법인지는 잘 모르겠습니다. –

+0

코드가 너무 무거워서 속도가 느려지는 자바 스크립트가 아니라고 생각합니다. 내 대답을 확인하십시오. –

답변

6

그래서 ..이 문제가 아니라 하나의 원인은, 할 수있다의 : 함수가 실행되는 동안]

  1. 자바 스크립트가 페이지를 차단 :를 함수가 실행되는 동안, 모든 페이지가 차단 된 상태로 유지 달리기를 멈출 때까지. 일반적으로 밀리 초가 걸리고 사람이인지하지 못하지만 루프 내부에 하드 프로세스가 있으면 몇 초가 걸릴 수 있으며 명확하게 볼 수 있습니다.
  2. 큰 이미지를로드하는 데 너무 오래 걸릴 수 있습니다 : 크기가 클수록 파일을로드하는 데 오래 걸립니다. 평균 크기가 5MB 인 이미지가 100 개라면 이미지를 모두로드하는 데 시간이 오래 걸립니다 (병렬로로드되지 않음).
  3. 병렬로드 파일로드 :browsers has a limit number for requests on each host (any.thing.com); 따라서 동일한 호스트 (www.yourhost.com/images/#{imgname)에 100 개의 이미지를로드하려고하면 모든 이미지를 동시에로드 할 수 없으며 브라우저는 가능한 많은 요청을 처리합니다. 하나의 호스트와 다른 모든 큐.

좋아, 지금 당신의이 솔루션 가자, 많은 요청이있는 페이지에 대한 몇 가지 HTTP 문제를 알고 : D

  1. 자바 스크립트 블록 :이 아니다 귀하의 경우 만 해결이를 자바 스크립트의 동시성을 깨뜨려 야합니다. 방법?
    • 루프를 제거하십시오.
    • 루프 안에 코드로 함수를 작성하십시오. 이 함수는 요소에 대한 목록 및 색인을 수신해야합니다. 새로운 기능에
    • 는 인덱스를 증가
    • (이 동시성 끊어집니다 )을 setTimeout 기능을 사용하여, 당신은 단지 수신 된 인덱스에 대한 요소로 작동하고, (recursivity처럼) 다시 함수를 호출
  2. 큰 이미지 : 해결하기 쉽습니다. 이 솔루션의 핵심은 엄지 손가락 대신 실제 이미지를 보여주는 것입니다. @ MichalPlško (phpThumb)가 제안한 스크립트를 사용할 수 있습니다. 또한로드하는 이미지의 수를 제한하고 Pinterest do (자동로드로 페이징)와 같이 필요에 따라 더 많이로드해야합니다.
  3. 병렬 파일로드 : 이것은 실제 문제입니다. 너무 간단하지는 않지만 해결할 수있는 것은 아닙니다. D img01.yourdomain.com이 이미지 폴더 나 이와 비슷한 것을 가리키는 것처럼 하위 도메인을 만들고 올바른 위치를 가리켜 야합니다.
0

phpThumb()이라는 스크립트를 사용하여 캐싱 동작을 향상시킬 수 있습니다. 그것은 섬네일 이미지를 즉석에서 생성하고 서버 및 브라우저에서 이미지 캐싱을 처리합니다. 프로젝트 웹 사이트에서 :

적은 서버로드로 썸네일을 캐싱 할 수 있습니다. 모든 소스 이미지의 여러 크기가 별도로 캐시 될 수 있습니다.축소판은 (로컬) 원본 이미지가 수정되면 자동으로 업데이트됩니다.

따라서 썸네일 만들기, 그림 캐싱 및 이와 유사한 것으로 인해 문제가 발생할 것으로 생각되면이를 시도해보십시오. 나는 이것으로 큰 결과를 얻었다. 그들에게