기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
AWS SDK for PHP 버전 3이 포함된 Amazon S3 스트림 래퍼
Amazon S3 스트림 래퍼를 사용하면 , , file_get_contents
, , fopen
, copy
rename
unlink
mkdir
, 등의 내장 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() |
버킷에서 객체를 삭제합니다.
|
filesize() |
객체의 크기를 가져옵니다.
|
is_file() |
이 URL 파일인지 확인합니다.
|
file_exists() |
객체가 있는지 확인합니다.
|
filetype() |
가 파일 또는 버킷(dir)에 URL 매핑되는지 확인합니다. |
file() |
줄 배열로 객체의 콘텐츠를 로드합니다. |
filemtime() |
객체를 마지막으로 수정한 날짜를 가져옵니다. |
rename() |
객체를 복사한 다음 원본을 삭제하여 객체의 이름을 바꿉니다. |
참고
copy
일반적으로 Amazon S3 스트림 래퍼에서 작동하지만 의 copy
함수 내부로 인해 일부 오류가 제대로 보고되지 않을 수 있습니다PHP. 대신 AwsS3ObjectCopier 인스턴스를 사용하는 것이 좋습니다.
버킷 및 폴더 작업
mkdir()
를 사용하여 버킷 작업
PHP 가 파일 시스템에서 디렉터리를 생성하고 트래버스하는 방법과 유사하게 Amazon S3 버킷을 생성하고 탐색할 수 있습니다.
다음은 버킷을 생성하는 예제입니다.
mkdir('s3://amzn-s3-demo-bucket');
참고
2023년 4월, 이제 Amazon S3가 S3 블록 퍼블릭 액세스 차단을 활성화하고 새로 생성된 모든 버킷에 대해 액세스 제어 목록을 비활성화합니다. 이 변경 사항은 StreamWrapper
의 mkdir
함수가 권한 및 에서 작동하는 방식에도 영향을 미칩니다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()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 캐시를 사용합니다.