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.
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
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
đã 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