공유 호스트의 최대 실행 시간은 고정되어 있습니다. 관리자에 대한 내 PHP 스크립트가 초과

원숭이

내 고객은 기업가이며 html 지식이 없습니다. 그는 리눅스 공유 호스팅 환경 (기본 패키지)에서 PHP로 만든 웹 사이트를 가지고 있습니다. 그의 사이트에서 그는 사진과 함께 이전 작업을 보여주고 싶습니다. 그러나 그는 관리자로 로그인하고 그 사진을 직접 업로드하는 것이 어렵다고 불평합니다.

-이제 그는 자신의 Dropbox 계정에있는 사진을 자신의 사이트에 업로드 할 수 있도록 쉬운 것을 작성해달라고합니다. 나는 OK라고 말했다 :)

관리자 페이지를 만들었습니다 (여기에서 제 고객은 자신의 사이트에 다운로드 할 보관 용 앨범을 선택할 수 있습니다.)-PHP 용 보관 용 API를 사용하여 사진 앨범을 찾았습니다. -POST-request (parameter = dropbox account의 파일 경로)를 수행 할 제출 버튼으로 앨범을 나열하는 양식을 만들었습니다.

해당 요청에 대한 코드는 다음과 같습니다.

if (isset($_POST['AlbumAdd'])) { 
    $name = $_POST['AlbumAdd'];
    //echo "submitted: $name <br>";
    $entry = getClient()->getMetadataWithChildren($name); //dropbox-sdk 
    if ($entry['is_dir']) {

        //for now create file on localhost -> replace with ftp to upload on shared hosting site
        if (!file_exists(__DIR__ . "/../examples/folder" . $name)) { //if !excists create folder on localhost
            mkdir(__DIR__ . "/../examples/folder" . $name, 0777, true);
            //echo "created " . $name  . "on localhost";
        } 
        foreach ($entry['contents'] as $child) {
            $cp = $child['path'];
            $size = $child['size'];
            $cn = basename($cp);
            echo "basename (cn)= " . $cn . " [$size] <br>";
            if (!$child['is_dir']) //files only
            {
                //download from dropbox to localhost 
                getClient()->getFile($cp, fopen(__DIR__ . '/../examples/folder' . $cp, 'w+b'));
            }
        }
    }
}

작은 파일에서는 잘 작동하지만 앨범이 너무 크면 다음 예외가 발생합니다.

Fatal error: Maximum execution time of 30 seconds exceeded in C:\wamp\www\dropbox-sdk-php-1.1.4\dropbox-sdk\Dropbox\CurlStreamRelay.php on line 26
TEST OUTPUT:
basename (cn)= 01.mp3 [8.1 MB]
basename (cn)= 02.mp3 [7.3 MB]
basename (cn)= 03.mp3 [6 MB] 

지금 가장 좋은 것은 무엇입니까 ?? -호스팅 사이트의 헬프 데스크에서 최대 실행 시간 설정을 변경할 수 없다고합니다. 따라서 내 php.ini 파일을 변경할 필요가 없습니다.

-각 사진을 개별적으로 업로드 하시겠습니까?

-전용 서버로 전환하면 내가 모든 권한을 갖게 되나요? 내 고객이 매월 125 유로를 추가로 지불하는 것을 좋아하는지 모르겠습니다.

마르코스

클라이언트 측 로직을 사용하여 로직을 리팩터링해야한다고 생각
합니다. 먼저 원격 폴더의 구조 (getMetadataWithChildren () 사용)를 다운로드하고 일종의 인덱싱 (예 : 각 파일 할당)을 사용하여 디스크에 저장해야합니다. / dir은 고유 한 ID를 다운로드합니다). 이 작업은 공급자가 설정 한 최대 실행 시간 제한 내에 종료되어야합니다.
그런 다음 두 번째 스크립트를 작성하여 실제 데이터를 다운로드하고 이전에 다운로드 한 색인을 한 번에 하나씩 읽어야합니다.
스크립트는 "MAXIMUM EXECUTION TIME"오류를 포착하여 아직 작업이 완료되지 않았 음을 알려야합니다. 다음과 같이됩니다.

파일 : "download_data_from_dropbox.php"

<?php
  register_shutdown_function('shutdown');

  global $id;
  DOWNLOAD_DATA($id);
  echo json_encode(array("done" => 1);
  exit 0;

  function shutdown() {
    $e = error_get_last();
    if ($e == "max_execution_time") {
      echo json_encode(array("lastId" => $id);
      exit 0;
    }
  }
?>

그런 다음 php 스크립트를 호출하여 완료 될 때까지 Dropbox에서 데이터를 반복적으로 다운로드해야합니다.

파일 "index.html":

<html>
  <head>
  </head>
  <body>
  ...
  <div id="status"></div>
  ...
  <script>
  $(document).ready(function() {
      var done = false, id = '',
      while (!done) {
          var url = "download_data_from_dropbox.php?id=" + id;
          $.ajax({
              url: url,
              dataType: 'json',
          }).done(function(response) {
              if (response.done === 1) {
                  // php script is done
                  done = true;
              }
              $("#status").html("Downloading data, last file ID is " + response.lastId   + " ...");
          }).fail(function(jqXHR, textStatus) {
              $("#mybox").html("Error while downloading data: " textStatus);
              done = true;
          });
      }
  });
  </script>
  </body>
</html>

참고 :이 코드는 가능한 솔루션을 보여주기위한 간단한 시도이며, 의사 코드가 포함되어 있으며, 전혀 완료되지 않았으며, 물론 테스트되지도 않았습니다 ... :-) javascript setInterval()에서 while (!done)루프 대신을 사용해야합니다 . 암호...

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관