AWS SDK for PHP 버전 3이 포함된 Amazon S3 스트림 래퍼 - AWS SDK for PHP

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

AWS SDK for PHP 버전 3이 포함된 Amazon S3 스트림 래퍼

Amazon S3 스트림 래퍼를 사용하면 , , file_get_contents, , fopen, copyrenameunlinkmkdir, 등의 내장 PHP 함수를 사용하여 Amazon S3에서 데이터를 저장하고 검색할 수 있습니다rmdir.

Amazon S3 스트림 래퍼를 사용하려면 등록해야 합니다.

$client = new Aws\S3\S3Client([/** options **/]); // Register the stream wrapper from an S3Client object $client->registerStreamWrapper();

그러면 s3:// 프로토콜을 사용하여 Amazon S3에 저장된 버킷과 객체에 액세스할 수 있습니다. Amazon S3 스트림 래퍼는 버킷 이름 뒤에 슬래시와 선택적 객체 키 또는 s3://<bucket>[/<key-or-prefix>] 접두사가 오는 문자열(예: )을 허용합니다.

참고

스트림 래퍼는 읽기 이상의 권한이 있는 객체 및 버킷으로 작업하도록 설계되었습니다. 즉, 사용자가 상호 작용해야 하는 버킷에 대해 ListBucket을 실행하고 객체에 대해 GetObject를 실행할 수 있는 권한이 있어야 합니다. 이 권한이 없는 경우 Amazon S3 클라이언트 작업을 직접 사용하는 것이 좋습니다.

데이터 다운로드

file_get_contents를 사용하여 객체의 콘텐츠를 선택할 수 있습니다. 하지만 이 함수는 객체의 전체 콘텐츠를 메모리로 로드하므로 주의하십시오.

// Download the body of the "key" object in the "bucket" bucket $data = file_get_contents('s3://bucket/key');

더 큰 파일로 작업하거나 Amazon S3에서 데이터를 스트리밍해야 하는 경우 fopen()을 사용합니다.

// Open a stream in read-only mode if ($stream = fopen('s3://bucket/key', 'r')) { // While the stream is still open while (!feof($stream)) { // Read 1,024 bytes from the stream echo fread($stream, 1024); } // Be sure to close the stream resource when you're done with it fclose($stream); }
참고

파일 쓰기 오류는 fflush를 호출하는 경우에만 반환되고, 플러시되지 않은 fclose를 호출하는 경우에는 반환되지 않습니다. 내부 fclose에 대한 응답으로 반환되는 오류에 상관없이 스트림을 닫을 경우 true에 대한 반환 값은 fflush입니다. 가 오류를 PHP 구현하는 방식 file_put_contents 때문에 를 호출할 때도 이러한 오류가 반환되지 않습니다.

검색 가능한 스트림 열기

"r" 모드에서 열린 스트림에서는 기본적으로 데이터를 읽을 수만 있고 검색할 수 없습니다. 이렇게 하면 Amazon S3에서 스트리밍 방식으로 데이터를 다운로드할 수 있으므로 이전에 읽은 바이트를 메모리로 버퍼링할 필요가 없습니다. 스트림을 검색할 수 있어야 하는 경우 seekable을 함수의 스트림 콘텍스트 옵션으로 전달합니다.

$context = stream_context_create([ 's3' => ['seekable' => true] ]); if ($stream = fopen('s3://bucket/key', 'r', false, $context)) { // Read bytes from the stream fread($stream, 1024); // Seek back to the beginning of the stream fseek($stream, 0); // Read the same bytes that were previously read fread($stream, 1024); fclose($stream); }

검색 가능한 스트림을 열어서 이전에 읽은 바이트를 검색할 수 있습니다. 원격 서버에서 아직 읽지 않은 바이트로 건너뛸 수 없습니다. 이전에 읽은 데이터를 복원할 수 있도록 스트림 데코레이터를 사용하여 PHP 임시 스트림에서 데이터가 버퍼링됩니다. 캐시된 데이터의 양이 2MB를 초과할 경우 임시 스트림의 데이터가 메모리에서 디스크로 전송됩니다. seekable 스트림 콘텍스트 설정을 사용하여 Amazon S3에서 큰 파일을 다운로드할 때 이 점을 유의하시기 바랍니다.

데이터 업로드

file_put_contents()를 사용하여 Amazon S3에 데이터를 업로드할 수 있습니다.

file_put_contents('s3://bucket/key', 'Hello!');

fopen() 및 "w", "x" 또는 "a" 스트림 액세스 모드로 데이터를 스트리밍하여 큰 파일을 업로드할 수 있습니다. Amazon S3 스트림 래퍼에서는 스트림 읽기와 쓰기(예: "r+", "w+" 등)를 동시에 지원하지 않습니다. 이는 HTTP 프로토콜이 동시 읽기 및 쓰기를 허용하지 않기 때문입니다.

$stream = fopen('s3://bucket/key', 'w'); fwrite($stream, 'Hello!'); fclose($stream);
참고

Amazon S3는 요청 페이로드를 전송하기 이전에 Content-Length 헤더를 지정해야 합니다. 따라서 PutObject 작업에서 업로드할 데이터는 스트림이 플러시되거나 닫힐 때까지 PHP 임시 스트림을 사용하여 내부적으로 버퍼링됩니다.

참고

파일 쓰기 오류는 fflush를 호출하는 경우에만 반환되고, 플러시되지 않은 fclose를 호출하는 경우에는 반환되지 않습니다. 내부 fclose에 대한 응답으로 반환되는 오류에 상관없이 스트림을 닫을 경우 true에 대한 반환 값은 fflush입니다. 가 오류를 PHP 구현하는 방식 file_put_contents 때문에 를 호출할 때도 이러한 오류가 반환되지 않습니다.

fopen 모드

PHP의 fopen() 함수를 사용하려면 $mode 옵션을 지정해야 합니다. 모드 옵션은 스트림에서 데이터를 읽거나 쓸 수 있는지 여부와 스트림을 열 때 파일이 존재해야 하는지 여부를 지정합니다.

Amazon S3 스트림 래퍼는 Amazon S3 객체를 대상으로 하는 스트림에 대해 다음 모드를 지원합니다.

r

읽기 전용 스트림이며 개체가 이미 존재해야 합니다.

w

쓰기 전용 스트림이며, 개체가 이미 있는 경우 파일을 덮어씁니다.

a

쓰기 전용 스트림이며, 개체가 이미 있는 경우 파일이 임시 스트림에 다운로드되고, 스트림에 쓰는 내용이 이전에 업로드한 데이터에 추가됩니다.

x

쓰기 전용 스트림이며, 개체가 없으면 오류가 발생합니다.

기타 객체 함수

스트림 래퍼를 사용하면 Amazon S3와 같은 사용자 지정 시스템에서 다양한 내장 PHP 함수를 사용할 수 있습니다. 다음은 Amazon S3 스트림 래퍼를 사용하여 Amazon S3에 저장된 객체로 수행할 수 있는 몇 가지 함수입니다.

unlink()

버킷에서 객체를 삭제합니다.

// Delete an object from a bucket unlink('s3://bucket/key');

DeleteObject 작업에 사용 가능한 옵션을 전달하여 객체를 삭제하는 방법을 수정할 수 있습니다(예: 특정 객체 버전 지정).

// Delete a specific version of an object from a bucket unlink('s3://bucket/key', stream_context_create([ 's3' => ['VersionId' => '123'] ]);

filesize()

객체의 크기를 가져옵니다.

// Get the Content-Length of an object $size = filesize('s3://bucket/key', );

is_file()

이 URL 파일인지 확인합니다.

if (is_file('s3://bucket/key')) { echo 'It is a file!'; }

file_exists()

객체가 있는지 확인합니다.

if (file_exists('s3://bucket/key')) { echo 'It exists!'; }

filetype()

가 파일 또는 버킷(dir)에 URL 매핑되는지 확인합니다.

file()

줄 배열로 객체의 콘텐츠를 로드합니다. GetObject 작업에 사용 가능한 옵션을 전달하여 파일을 다운로드하는 방법을 수정할 수 있습니다.

filemtime()

객체를 마지막으로 수정한 날짜를 가져옵니다.

rename()

객체를 복사한 다음 원본을 삭제하여 객체의 이름을 바꿉니다. CopyObjectDeleteObject 작업에 사용 가능한 옵션을 스트림 콘텍스트 파라미터에 전달하여 객체를 복사하고 삭제하는 방법을 수정할 수 있습니다.

참고

copy 일반적으로 Amazon S3 스트림 래퍼에서 작동하지만 의 copy 함수 내부로 인해 일부 오류가 제대로 보고되지 않을 수 있습니다PHP. 대신 AwsS3ObjectCopier 인스턴스를 사용하는 것이 좋습니다.

버킷 및 폴더 작업

mkdir()를 사용하여 버킷 작업

PHP 가 파일 시스템에서 디렉터리를 생성하고 트래버스하는 방법과 유사하게 Amazon S3 버킷을 생성하고 탐색할 수 있습니다.

다음은 버킷을 생성하는 예제입니다.

mkdir('s3://amzn-s3-demo-bucket');
참고

2023년 4월, 이제 Amazon S3가 S3 블록 퍼블릭 액세스 차단을 활성화하고 새로 생성된 모든 버킷에 대해 액세스 제어 목록을 비활성화합니다. 이 변경 사항은 StreamWrappermkdir 함수가 권한 및 에서 작동하는 방식에도 영향을 미칩니다ACLs. 자세한 내용은 의 새로운 기능 AWS 문서에서 확인할 수 있습니다.

스트림 컨텍스트 옵션을 mkdir() 메서드에 전달하여 CreateBucket 작업에 사용할 수 있는 파라미터를 사용하여 버킷 생성 방법을 수정할 수 있습니다.

// Create a bucket in the EU (Ireland) Region mkdir('s3://amzn-s3-demo-bucket', 0500, true, stream_context_create([ 's3' => ['LocationConstraint' => 'eu-west-1'] ]));

rmdir() 함수를 사용하여 버킷을 삭제할 수 있습니다.

// Delete a bucket rmdir('s3://amzn-s3-demo-bucket);
참고

버킷은 비어있는 경우에만 삭제할 수 있습니다.

mkdir()를 사용한 폴더 작업

버킷을 생성하면 파일 시스템에서처럼 폴더 기능을 수행하는 객체를 생성하는 mkdir()를 사용할 수 있습니다.

다음 코드 조각은 'my-folder'라는 폴더 객체를 'amzn-s3-demo-bucket'이라는 기존 버킷에 추가합니다. 슬래시 (/) 문자를 사용하여 폴더 객체 이름을 버킷 이름 및 추가 폴더 이름과 구분합니다.

mkdir('s3://amzn-s3-demo-bucket/my-folder')

2023년 4월 이후의 권한 변경에 대한 이전 참고 사항은 폴더 객체를 생성할 때도 적용됩니다. 이 블로그 게시물에는 필요한 경우 권한을 조정하는 방법에 대한 정보가 있습니다.

rmdir() 함수를 사용하여 다음 코드 조각에 표시된 것처럼 빈 폴더 객체를 삭제합니다.

rmdir('s3://amzn-s3-demo-bucket/my-folder')

버킷의 콘텐츠 나열

Amazon S3 스트림 래퍼와 함께 opendir(), readdir(), rewinddir()closedir() PHP 함수를 사용하여 버킷의 콘텐츠를 통과할 수 있습니다. ListObjects 작업에 사용할 수 있는 파라미터를 opendir() 함수에 사용자 지정 스트림 컨텍스트 옵션으로 전달하여 객체가 나열되는 방식을 수정할 수 있습니다.

$dir = "s3://bucket/"; if (is_dir($dir) && ($dh = opendir($dir))) { while (($file = readdir($dh)) !== false) { echo "filename: {$file} : filetype: " . filetype($dir . $file) . "\n"; } closedir($dh); }

PHP의 를 사용하여 버킷의 각 객체와 접두사를 반복적으로 나열할 수 있습니다RecursiveDirectoryIterator.

$dir = 's3://bucket'; $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir)); foreach ($iterator as $file) { echo $file->getType() . ': ' . $file . "\n"; }

버킷의 콘텐츠를 반복적으로 나열하여 HTTP 요청을 줄이는 또 다른 방법은 Aws\recursive_dir_iterator($path, $context = null) 함수를 사용하는 것입니다.

<?php require 'vendor/autoload.php'; $iter = Aws\recursive_dir_iterator('s3://bucket/key'); foreach ($iter as $filename) { echo $filename . "\n"; }

스트림 콘텍스트 옵션

사용자 지정 스트림 콘텍스트 옵션을 전달하여 버킷과 키에 대해 이전에 로드된 정보를 캐시하는 데 사용되는 캐시 또는 스트림 래퍼에 사용되는 클라이언트를 사용자 지정할 수 있습니다.

스트림 래퍼는 모든 작업에서 다음과 같은 스트림 콘텍스트 옵션을 지원합니다.

client

명령을 실행하는 데 사용할 Aws\AwsClientInterface 객체입니다.

cache

이전에 가져온 파일 통계를 캐시하는 데 사용할 Aws\CacheInterface의 인스턴스입니다. 기본적으로 스트림 래퍼는 메모리 내 LRU 캐시를 사용합니다.