2013-10-02 2 views
1

나는 CakePHP 내의 파일과 폴더로 작업하고 있습니다. 이제 모든 것이 잘 작동하고 내가 원하는 방식대로 작동합니다. 그러나 파일을 압축하면 다음과 같은 오류 메시지가 나타납니다.CakePHP에서 Zip 파일을 만들고 'bytes exhausted'오류 메시지가 나타 납니까?

Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 240047685 bytes) 

작은 파일을 압축하면 좋습니다! 나는 크기가 더 큰 지퍼가 문제가있는 것처럼 보일지라도 문제없이 약 10MB의 크기로 파일을 처리했다.

이제 내 .htaccess 파일에 다음을 추가하고 php.ini 파일을 만들었습니다.

php_value upload_max_filesize 640000000M 
php_value post_max_size 640000000M 
php_value max_execution_time 30000000 
php_value max_input_time 30000000 

사실 저는 PHP가 4GB 파일 한도로 가리키는 일부 게시물을 발견했습니다. 그럼에도 불구하고, 왜 내 zip 파일은이 파일 (약 245MB 정도)을 수행하지 않습니다.

public function ZippingMyData() { 
    $UserStartPath = '/data-files/tmp/'; 
    $MyFileData = $this->data['ZipData']; //this is the files selected from a form! 

     foreach($MyFileData as $DataKey => $DataValue) { 
     $files = array($UserStartPath.$DataValue); 
     $zipname = 'file.zip'; 
     $zip = new ZipArchive(); 
     $zip_name = time().".zip"; // Zip name 
     $zip->open($zip_name, ZipArchive::CREATE); 

     foreach ($files as $file) { 
     $path = $file; 
       if(file_exists($path)) { 
      $zip->addFromString(basename($path), file_get_contents($path)); 
       } else { 
      echo"file does not exist"; 
      } 
     } //End of foreach loop for $files 
     } //End of foreach for $myfiledata 

     $this->set('ZipName', $zip_name); 
     $this->set('ZipFiles', $MyFileData); 
     $zip->close(); 
     copy($zip_name,$UserStartPath.$zip_name); 
     unlink($zip_name); //After copy, remove temp file. 
     $this->render('/Pages/download'); 
    } //End of function 

내가 잘못 가고있는 아이디어가 있습니까? 나는 이것이 나의 코드가 아니라는 것을 언급 할 것이고, 나는 다른 것들에 그것의 비트를 발견하고 나의 프로젝트에 대한 나의 필요에 맞도록 그것을 바 꾸었습니다!

환영 모든 도움 ...

감사

글렌

.

+0

'php_value memory_limit 256M' 또한 Suhosin과 같은 확장 기능이 설치되어있어 메모리 사용량에 제한이 있는지 확인하십시오. – ndm

+0

나는 이것을 내 자신의 VM 내부에서 실행하고 있는데, 나는 완전한 제어권을 가지고있다. 메모리에서 기본 PHP5 파일 만 설치했다고 생각합니다. 나는이 프로젝트가 VPS에서 호스트가 될 것이라고 생각한다. 그렇지 않으면 내가 통제 할 수있는 것이 없을 것이다. 즉, 서버에 설치할 수있는 다른 것을 생각할 수 있다면, 파일 제한이 없다는 것을 확인한 다음, 가라. 바로 앞에! - 글렌 –

+0

덕분에 php_ini 파일 상단에 'php_value memory_limit 256M'이 추가되었습니다. 그것은 작동하지 않았다, 여전히 나에게 같은 오류 메시지를 제공합니까? php.ini 파일이 작동하는지 확인하기 위해 CakePHP에서 phpinfo를 실행하는 방법은 무엇입니까? 내 파일은 어디에서 호스팅해야합니까? 그 WWW 폴더의 루트입니다, 케이크의 webroot 폴더로 이동해야합니까? 고마워 글렌. –

답변

1

나는 ZipArchive이 파일을 메모리에로드한다고 생각하므로 php.ini에서 memory_limit 매개 변수를 늘려야합니다.
는 서버와 드롭 성능의 모든 메모리를 사용하지 않도록하려면, 파일이 큰 경우 더 나은 (그러나이 될 멀리에서 가장 좋은) 솔루션을해야한다 :

public function ZippingMyData() { 
$UserStartPath = '/data-files/tmp/'; 
$MyFileData = $this->data['ZipData']; //this is the files selected from a form! 

foreach($MyFileData as $DataKey => $DataValue) { 
    $files = array($UserStartPath.$DataValue); 
    $zip_name = time().".zip"; // Zip name 
    // Instead of a foreach you can put all the files in a single command: 
    // /usr/bin/zip $UserStartPath$zip_name $files[0] $files[1] and so on 
    foreach ($files as $file) { 
     $path = $file; 
     if(file_exists($path)) { 
     exec("/usr/bin/zip $UserStartPath$zip_name basename($path)"); 
     } else { 
     echo"file does not exist"; 
     } 
    } //End of foreach loop for $files 
    } //End of foreach for $myfiledata 

    $this->render('/Pages/download'); 
} //End of function 

또는 유사한은 (서버에 따라 다름) . 이 솔루션에는 디스크 공간 및 zip 제한이라는 두 가지 제한 사항 만 있습니다.
코드의 품질 및 오류에 대해 사과드립니다.

+0

나는 이것을 시험해 보았다! 이 코드로 어디를 가든 코드가 서버가 PHP가 아닌 서버를 실행하게하는 것입니다. Um은 NodeJS와 같은 코드 사용과 관련하여 다른 방법을 연구하고 있다고 생각하지 않았습니다. 많은 고마워, 나는 이것을 시도하고 알려 드리겠습니다.글렌. –

+0

@GlennCurtis : 경로 이름에주의하십시오. zip은 파일의 위치를 ​​알아야하며 아마도 -j 옵션을 사용하여 경로 이름을 정크해야합니다. 그렇지 않으면 압축을 풀면 경로 이름으로 '/ data-files/tmp /'와 같은 형식이됩니다 압축을 푼 파일. – AndrewQ

+0

나는 이것을 시도하고 있는데, 현재 시도는 debug (exec ("/ usr/local/bin/zip /". $ UserStartPath. $ zip_name. $ path)); 그러나 디버그는 그냥 빈 배열을 던져 버리고 디버그없이 실행하여 zip을 만들었는지 확인합니다. 내가 제대로하고 있는지 잘 모르겠다. –

관련 문제