[英]AWS s3 multipart upload fails + memory allocation exhausted + php
我正在嘗試將大約 9GB 的非常大的視頻從我的服務器上傳到 s3 輸入。 我在服務器上有 4GB 內存。 我正在使用http://docs.aws.amazon.com/aws-sdk-php/v2/api/class-Aws.S3.S3Client.html#_completeMultipartUpload
我還在 script 中將 memory_limit 設置為 4GB 。 但它仍然失敗並拋出內存耗盡錯誤 - 試圖分配內存 bla bla bla .. 我發現的是https://www.eldos.com/forum/read.php?FID=7&TID=6331
是否有解決此問題的解決方案? . 下面是我的示例代碼。 我正在使用 laravel 5.1 並使用
$client = App::make('aws')->createClient('s3');
try {
$response = $client->createMultipartUpload(array(
'Bucket' => $bucket,
'Key' => $fileName
));
$uploadId = $response['UploadId'];
// 3. Upload the file in parts.
$file = fopen(public_path('videos') . '/' . $fileName, 'r');
$parts = array();
$partNumber = 1;
while (!feof($file)) {
$result = $client->uploadPart(array(
'Bucket' => $bucket,
'Key' => $fileName,
'UploadId' => $uploadId,
'PartNumber' => $partNumber,
'Body' => fread($file, 2 * 1024 * 1024),
));
$parts[] = array(
'PartNumber' => $partNumber++,
'ETag' => $result['ETag'],
);
}
// 4. Complete multipart upload.
$result = $client->completeMultipartUpload(array(
'Bucket' => $bucket,
'Key' => $fileName,
'UploadId' => $uploadId,
'MultipartUpload' => Array(
'Parts' => $parts,
),
));
return $fileName;
}
catch (\Aws\S3\Exception\S3Exception $e) {
$result = $client->abortMultipartUpload(array(
'Bucket' => $bucket,
'Key' => $fileName,
'UploadId' => $uploadId
));
throw new Exception($e->getMessage(), NULL, NULL);
}
Thanks
我遇到了同樣的問題,我花了一段時間,因為我必須學習以下內容:
您正在尋找的是: http : //docs.aws.amazon.com/aws-sdk-php/v3/guide/service/s3-multipart-upload.html
Workig 代碼示例(來自該文檔):
use Aws\S3\MultipartUploader;
use Aws\Exception\MultipartUploadException;
$uploader = new MultipartUploader($s3Client, '/path/to/large/file.zip', [
'bucket' => 'your-bucket',
'key' => 'my-file.zip',
]);
try {
$result = $uploader->upload();
echo "Upload complete: {$result['ObjectURL']}\n";
} catch (MultipartUploadException $e) {
echo $e->getMessage() . "\n";
}
低級 API(如您的示例中所示)不起作用,因為它會創建所選塊大小的臨時文件並占用內存(即使您銷毀 s3_client 對象)。
在我的情況下,我確實遇到了(不可捕獲的)致命內存異常,在 S3 存儲上有一個完整的磁盤和部分上傳的文件(由於存儲使用而需要花錢),但沒有列在正常的 s3 存儲桶中(請參閱: http: //www.deplication.net/2016/06/aws-tip-save-s3-costs-with-abort.html )
這個例子使用了高級 api,它對我來說很好用,而且食物印記很小。
您不使用的鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.