2013-08-22 5 views
6

Używam pakietu SDK AWS 2.3.2 dla PHP, aby spróbować ściągnąć duży plik (~ 4g) z S3 za pomocą ich stream streamu, co powinno pozwolić mi na użyj fopen/fwrite, aby zapisać plik na dysk, a nie buforować go w pamięci.Błąd pamięci Heroku z PHP i czytanie dużego pliku z S3

Oto referencyjny:

http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-s3.html#downloading-data

Oto mój kod:

public function download() 
    { 

     $client = S3Client::factory(array(
        'key' => getenv('S3_KEY'), 
        'secret' => getenv('S3_SECRET') 
        )); 

     $bucket = getenv('S3_BUCKET'); 
     $client->registerStreamWrapper(); 

     try { 
      error_log("calling download"); 
      // Open a stream in read-only mode 
      if ($stream = fopen('s3://'.$bucket.'/tmp/'.$this->getOwner()->filename, 'r')) { 
       // While the stream is still open 
       if (($fp = @fopen($this->getOwner()->path . '/' . $this->getOwner()->filename, 'w')) !== false){ 

        while (!feof($stream)) { 
         // Read 1024 bytes from the stream 
         fwrite($fp, fread($stream, 1024)); 
        } 
        fclose($fp); 
       } 
      // Be sure to close the stream resource when you're done with it 
      fclose($stream); 
     } 

Te pliki do pobrania pliku, ale ja ciągle się komunikaty o błędach z Heroku:

2013- 08-22T19: 57: 59.537740 + 00: 00 heroku [uruchom.9336]: Proces uruchomiony mem = 515m (100,6%) 2013-08-22T19: 57: 59,537972 + 00: 00 Heroku [run.9336] błąd R14 (kwota pamięci przekroczone)

co prowadzi mi, że to wciąż buforowanie do pamięci jakoś. Próbowałem użyć https://github.com/arnaud-lb/php-memory-profiler, ale dostałem błąd Seg.

Próbowałem również pobrać plik przy pomocy cURL z opcją CURLOPT_FILE, aby napisać bezpośrednio na dysk i wciąż brakuje pamięci. Dziwna rzecz jest według top moja instancja php używa 223m pamięci, więc nawet połowa dozwolonego 512.

Ktoś ma jakieś pomysły? Używam tego z php 5.4.17 cli do przetestowania.

+0

Próbowałem także polecenia kopiowania php i używając fflush ($ fp), aby opróżnić bufor zapisu. To NIE powinno wyczerpywać pamięci – bonez

+0

Czy można zmienić na 'rb' i' wb', aby odczytywać i zapisywać pliki w trybie binarnym? Co więcej, nie powinno to niczego zmieniać, ale tylko po to, aby upewnić się - czy otrzymasz takie same wyniki, jeśli używasz tymczasowej zmiennej do przechowywania danych między czytaniem a pisaniem? – culix

+0

próbowałem, że nic nie zmienia ... także, aby było jasne: z wiersza poleceń - $ curl -O http://test.s3.amazonaws.com/file.zip również powoduje błąd pamięci, który moim zdaniem jest problem. Może to być fałszywy błąd, którego nie znam, mam prośbę o wsparcie w Heroku – bonez

Odpowiedz

2

Czy już próbowałeś z 2x dyna, mają one 1GB pamięci?

Możesz także spróbować pobrać plik, wykonując polecenie curl w PHP. To nie jest najczystszy sposób, ale będzie znacznie szybszy/bardziej niezawodny i przyjazny dla pamięci.

exec("curl -O http://test.s3.amazonaws.com/file.zip", $output); 

Ten przykład dotyczy publicznego adresu URL. Jeśli nie chcesz, aby Twoje pliki S3 były publiczne, zawsze możesz utworzyć podpisany URL i użyć go w połączeniu z poleceniem curl.

+0

Tak, a następnie otrzymuję 2013-08-23T14: 30: 06.785538 + 00: 00 heroku [run.7646]: Proces uruchamiania mem = 1024M (100.0%) 2013-08-23T14: 30: 06.785658 + 00: 00 heroku [run.7646]: Błąd R14 (przekroczenie limitu pamięci) – bonez

+0

Może powinieneś wypróbować implementację curl, tak jak wyjaśniłem w moim edytowanym poście powyżej. –

+0

Próbowałem wdrożenia i tego samego wyniku: 2013-08-23T19: 23: 29,446439 + 00: 00 heroku [uruchom.2306]: Proces uruchamiania mem = 1024M (100,0%) 2013-08-23T19: 23: 29.447246+ 00:00 heroku [uruchom.2306]: Błąd R14 (przekroczenie limitu pamięci) – bonez