2015-01-11 2 views
1

각각에 대해 다시 연결하지 않고 한 번에 여러 파일을 업로드 할 수있는 방법이 있습니까?PHP에서 Amazon S3로 여러 파일 업로드

대용량 (한 번에 100 개)의 작은 (약 10k) 이미지 파일을 저장해야하는 PHP 응용 프로그램의 저장소로 S3를 사용하고 있습니다. 현재이 코드를 통해 반복적으로이 코드를 사용하여 개별적으로 업로드하고 있습니다.

$s3->putObjectFile($uploadFile, $bucketName, ($uploadFile), S3::ACL_PUBLIC_READ) 

이 작업에는 시간이 오래 걸립니다. 약 1.5MB의 파일. 다른 답변에서 제안 된 것처럼 SSL을 끄는 것은 약 40 초로 줄어들지 만 여전히 느립니다.

여기에 어떤 도움을 주셔서 감사 PHP

에 대한
$s3 = new S3($awsAccessKey, $awsSecretKey, false); 


function send_to_s3($s3, $bucketName, $uploadFile) 

{ 

    $start = microtime(true); 



// Check if our upload file exists 
if (!file_exists($uploadFile) || !is_file($uploadFile)) 
    exit("\nERROR: No such file: $uploadFile\n\n"); 

// Check for CURL 
if (!extension_loaded('curl') && [email protected](PHP_SHLIB_SUFFIX == 'so' ? 'curl.so' : 'php_curl.dll')) 
    exit("\nERROR: CURL extension not loaded\n\n"); 



if ($s3->putObjectFile($uploadFile, $bucketName, ($uploadFile), S3::ACL_PUBLIC_READ)) 
    { 

    $end = microtime(true); 

    $took = $end - $start; 

    echo "S3::putObjectFile(): File copied to {$bucketName}/".($uploadFile).PHP_EOL . ' - ' . filesize($uploadFile) . ' in ' . $took . ' seconds<br />'; 

    return $took; 
    } 
else 
    { 
    print 'error'; 
    } 

} 

아마존 S3 REST 구현을 사용, 내 현재 코드입니다.

+2

공식 [PHP 용 AWS SDK (https://github.com/aws/aws-sdk-php는) 동시에 작업을 실행] (HTTP로 할 수 있습니다. co.kr/aws-sdk-php/guide/latest/feature-commands.html # execution-commands-in-parallel)을 참조하십시오. –

답변

0

여러 부분 업로드를 통해 이미지를 업로드하는 것이 좋습니다.

아래 코드는 Aws-sdk 버전 3을 사용하는 기본 예제입니다.

업데이트 http://docs.aws.amazon.com/aws-sdk-php/v2/guide/feature-commands.html#executing-commands-in-parallel : 그냥 제레미의 의견을주의

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 { 
    $uploader->upload(); 
    echo "Upload complete.\n"; 
} catch (MultipartUploadException $e) { 
    echo $e->getMessage() . "\n"; 
} 
0

나는 당신이해야 할 것은 여기에 문서에서 언급 한 바와 같이 병렬로 명령을 실행할 생각합니다. 죄송합니다! //docs.aws.amazon :

0
use Aws\S3\S3Client;  
use Aws\CommandPool;  
use Guzzle\Service\Exception\CommandTransferException;  

$commands = array();  
foreach ($objects as $key => $file) { 
    $fileContent = $file['body']; 
     $objParams = array ( 
      'ACL' => 'bucket-owner-full-control',  
      'Bucket' => 'bucket_name',  
      'Key' => 's3_path',  
      'Body' => $fileContent  
     );  
     $commands[] = $clientS3->getCommand('PutObject', $objParams);  
    }  
    try {  
     $results = CommandPool::batch($clientS3, $commands);  
    } catch (CommandTransferException $e) {  
     $succeeded = $e->getSuccessfulCommands();  
     echo "Failed Commands:\n";  
     foreach ($e->getFailedCommands() as $failedCommand) {  
      echo $e->getExceptionForFailedCommand($failedCommand)->getMessage() . "\n";  
     }  
    }  
관련 문제