2013-08-22 25 views
6

Tôi đang sử dụng SDK AWS 2.3.2 cho PHP để cố gắng kéo xuống một tệp lớn (~ 4g) từ S3 bằng cách sử dụng trình bao bọc luồng của chúng, điều này sẽ cho phép tôi sử dụng fopen/fwrite để ghi tập tin vào đĩa và không đệm vào bộ nhớ.Lỗi bộ nhớ Heroku với PHP và đọc tệp lớn từ S3

Đây là tài liệu tham khảo:

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

Đây là mã của tôi:

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); 
     } 

Các tải tập tin nhưng tôi liên tục nhận được thông báo lỗi từ Heroku:

2013- 08-22T19: 57: 59.537740 + 00: 00 heroku [run.9336]: Quy trình chạy mem = 515M (100,6%) 2013-08-22T19: 57: 59,537972 + 00: 00 Heroku [run.9336]: Lỗi R14 (quota Memory vượt)

Dẫn tôi để tin rằng đây vẫn là đệm vào bộ nhớ bằng cách nào đó. Tôi đã cố gắng sử dụng https://github.com/arnaud-lb/php-memory-profiler, nhưng có lỗi Seg.

Tôi cũng đã cố gắng tải xuống tệp bằng cách sử dụng cURL với tùy chọn CURLOPT_FILE để ghi trực tiếp vào đĩa và tôi vẫn đang hết bộ nhớ. Điều kỳ lạ là theo top trường hợp php của tôi đang sử dụng 223m bộ nhớ để thậm chí không một nửa số cho phép 512.

Bất kỳ ai có ý tưởng nào? Tôi đang chạy này từ php 5.4.17 cli để kiểm tra.

+0

Cũng thử lệnh sao chép php và sử dụng fflush ($ fp) để xóa bộ đệm ghi. Điều này KHÔNG nên làm cạn kiệt bộ nhớ – bonez

+0

Bạn có thể thay đổi thành 'rb' và' wb' để đọc và ghi tệp ở chế độ nhị phân không? Ngoài ra, điều này không nên thay đổi bất cứ điều gì nhưng chỉ để đảm bảo - bạn có nhận được kết quả tương tự nếu bạn sử dụng biến tạm thời để giữ dữ liệu giữa đọc và viết không? – culix

+0

đã cố gắng mà không thay đổi bất cứ điều gì ... cũng phải rõ ràng: từ dòng lệnh - $ curl -O http://test.s3.amazonaws.com/file.zip cũng gây ra lỗi bộ nhớ, mà tôi nghĩ là vấn đề. Nó có thể là một lỗi giả mạo tôi không biết, tôi có một yêu cầu hỗ trợ với Heroku – bonez

Trả lời

2

Bạn đã thử với 2x dyno, những bộ nhớ này có bộ nhớ 1GB không?

Những gì bạn cũng có thể thử tải xuống tệp bằng cách thực hiện lệnh curl trong PHP. Nó không phải là cách sạch nhất nhưng nó sẽ nhanh hơn/đáng tin cậy hơn và thân thiện với bộ nhớ.

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

Ví dụ này dành cho URL công khai. Nếu bạn không muốn đặt các tệp S3 của mình ở chế độ công khai, bạn luôn có thể tạo một URL đã ký và sử dụng nó kết hợp với lệnh curl.

+0

Có, và sau đó tôi nhận được 2013-08-23T14: 30: 06.785538 + 00: 00 heroku [run.7646]: Quy trình chạy mem = 1024M (100.0%) 2013-08-23T14: 30: 06.785658 + 00: 00 heroku [run.7646]: Lỗi R14 (vượt quá dung lượng bộ nhớ) – bonez

+0

Có lẽ bạn nên thử triển khai curl như tôi đã giải thích trong bài đăng đã chỉnh sửa ở trên. –

+0

Đã thử thực hiện đó và kết quả tương tự: 2013-08-23T19: 23: 29.446439 + 00: 00 heroku [chạy.2306]: Quy trình chạy mem = 1024M (100.0%) 2013-08-23T19: 23: 29.447246+ 00:00 heroku [run.2306]: Lỗi R14 (Đã vượt quá dung lượng bộ nhớ) – bonez

Các vấn đề liên quan