簡體   English   中英

AWS s3 分段上傳失敗 + 內存分配耗盡 + php

[英]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

我遇到了同樣的問題,我花了一段時間,因為我必須學習以下內容:

  • AWS SDK for php 中有一個低級 API
  • AWS SDK for php 中有一個高級 API
  • 野外有不同的文件

您正在尋找的是: 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,它對我來說很好用,而且食物印記很小。

您不使用的鏈接:

  • docs.aws.amazon.com/AmazonS3/latest/dev/usingHLmpuPHP.html
  • docs.aws.amazon.com/AmazonS3/latest/dev/LLuploadFilePHP.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM