고급 PHP 5 파일 관리

권한, 캐싱, 메타데이터 옵션

Cloud Storage용 App Engine 스트림 래퍼는 스트림 구성을 위해 다음 옵션을 제공합니다.

옵션 가능한 값 설명
acl 다음 값 중 하나:
  • private
  • public-read
  • public-read-write
  • authenticated-read
  • bucket-owner-read
  • bucket-owner-full-control
  • project-private
이러한 설정이 Cloud Storage에서 수행하는 작업에 대한 설명은 미리 정의된 ACL을 참조하세요. acl을 설정하지 않으면 Cloud Storage가 이 매개변수를 null로 설정하고 이 파일이 있는 버킷과 연결된 기본 객체 ACL을 사용합니다.
Content-Type 모든 유효한 MIME 유형 객체를 업로드할 때 콘텐츠 유형을 지정하지 않으면 Google Cloud Storage 시스템은 객체 제공 시 기본값binary/octet-stream으로 설정합니다.
Content-Disposition 모든 유효한 콘텐츠 처리 값 객체 데이터가 전송되는 방식에 관한 표시 정보를 지정하는 객체에 설정할 수 있는 헤더입니다.
Content-Encoding 모든 유효한 압축 알고리즘 gzip과 같은 객체의 압축 알고리즘입니다. Google Cloud Storage는 이 헤더를 토대로 객체를 자동으로 압축하거나 압축 해제하지 않습니다.
Content-Language 모든 유효한 ISO 639-1 언어 코드 콘텐츠의 ISO 639-1 언어 코드입니다(전체 목록은 언어 이름의 표시 코드 참조).
enable_cache true 또는 false(기본적으로 true) Cloud Storage에서 읽는 파일은 성능 개선을 위해 메모리(memcache 참조)에 캐시됩니다. 캐싱은 스트림 컨텍스트에서 enable_cache 지시문을 사용하여 해제할 수 있습니다.
enable_optimistic_cache true 또는 false(기본적으로 false) 마지막으로 캐시된 이후 Cloud Storage에서 기본 객체가 변경되었는지 여부를 확인하지 않고 캐시에서 파일 객체를 읽도록 낙관적 캐싱을 사용할 수 있습니다. 낙관적 캐싱은 한 번 쓰고 여러 번 읽는 상황에 이상적입니다.
metadata 연관 배열(예: ['foo' => 'far', 'bar' => 'boo'] 커스텀 메타데이터 읽기 및 쓰기를 참조하세요.
read_cache_expiry_seconds 캐시에서 객체가 유효한 상태로 유지되는 시간(초) read_cache_expiry_seconds directive를 사용하여 캐시된 객체의 유효 기간을 변경할 수 있습니다. 다음 읽기 시도 시 객체가 다시 캐시되기까지의 시간을 지정합니다. 기본적으로 1시간(3600초)으로 설정됩니다.
writable_cache_expiry_seconds 버킷의 쓰기 가능 상태가 캐시되는 시간(초) Cloud Storage 스트림 래퍼는 성능 개선을 위해 버킷의 쓰기 가능 상태를 캐시합니다. 따라서 여러 stat() 관련 함수에서 반환된 쓰기 가능 비트는 버킷의 ACL이 변경되면 일시적으로 동기화되지 않을 수 있습니다. 기본적으로 10분(600초)으로 설정됩니다.

다음 스니펫은 스트림 옵션 사용 방법을 보여줍니다.

$options = ['gs' => ['Content-Type' => 'text/plain']];
$context = stream_context_create($options);
file_put_contents("gs://${my_bucket}/hello_options.txt", $newFileContent, 0, $context);

위 스니펫에서 $options는 새 객체를 쓸 때 스트림이 사용하는 인수 집합이며 stream_context_set_default를 통해 기본 옵션으로 설정될 수 있습니다.

Cloud Storage에서 PHP 5 파일 시스템 함수 지원

Cloud Storage용 App Engine 스트림 래퍼는 여러 기본 PHP 파일 시스템 함수를 제공합니다. 일부 함수는 지원되지 않으며, 일부는 수정된 형태로 지원됩니다. 다음 표에 이러한 각 기본 함수와 함께 함수 지원 여부가 나열되어 있습니다. 함수가 지원되지만 수정 또는 제한된 형태로 지원되는 경우에는 해당 내용이 설명되어 있습니다.

파일 시스템 함수 지원 여부 세부정보
basename — 경로의 후행 이름 구성요소를 반환합니다. 지원됨
chgrp — 파일 그룹을 변경합니다. 지원되지 않음 항상 false를 반환합니다.
chmod — 파일 모드를 변경합니다. 지원되지 않음 항상 false를 반환합니다.
chown — 파일 소유자를 변경합니다. 지원되지 않음 항상 false를 반환합니다.
clearstatcache — 파일 상태 캐시를 지웁니다. 지원됨
copy — 파일을 복사합니다. 지원됨
dirname — 상위 디렉터리 경로를 반환합니다. 지원됨 지원되지만 gs:// 프리픽스가 포함됩니다.
disk_free_space — 파일 시스템 또는 디스크 파티션에서 사용할 수 있는 공간을 반환합니다. 지원되지 않음 이 함수는 중지되었습니다.
disk_total_space — 파일 시스템 또는 디스크 파티션의 총 크기를 반환합니다. 지원되지 않음 이 함수는 중지되었습니다.
diskfreespace — disk_free_space의 별칭입니다.
fclose — 열린 파일 포인터를 닫습니다. 지원됨
feof — 파일 포인터에서 파일 끝을 테스트합니다. 지원됨
fflush — 출력을 파일로 플러시합니다. 지원됨 효과가 없습니다. (항상 true를 반환합니다.)
fgetc — 파일 포인터에서 문자를 가져옵니다. 지원됨
fgetcsv — 파일 포인터에서 라인을 가져오고 CSV 필드를 파싱합니다. 지원됨
fgets — 파일 포인터에서 라인을 가져옵니다. 지원됨
fgetss — 파일 포인터에서 라인을 가져오고 HTML 태그를 제거합니다. 지원됨
file_exists — 파일 또는 디렉터리가 있는지 확인합니다. 지원됨
file_get_contents — 전체 파일을 문자열 한 개로 읽습니다. 지원됨
file_put_contents — 파일에 문자열을 씁니다. 지원됨
file — 전체 파일을 배열 한 개로 읽습니다. 지원됨
fileatime — 파일의 마지막 액세스 시간을 가져옵니다. 지원되지 않음 항상 0을 반환합니다.
filectime — 파일의 inode 변경 시간을 가져옵니다. 지원되지 않음 항상 0을 반환합니다.
filegroup — 파일 그룹을 가져옵니다. 지원되지 않음 항상 0을 반환합니다.
fileinode — 파일 inode를 가져옵니다. 지원되지 않음 항상 0을 반환합니다.
filemtime — 파일 수정 시간을 가져옵니다. 지원됨
fileowner — 파일 소유자를 가져옵니다. 지원되지 않음 항상 0을 반환합니다.
fileperms — 파일 권한을 가져옵니다. 지원됨 실행 비트는 항상 꺼져 있습니다.
filesize — 파일 크기를 가져옵니다. 지원됨
filetype — 파일 형식을 가져옵니다. 지원됨
flock — 이식 가능한 자문 파일을 잠급니다. 지원되지 않음 항상 false를 반환합니다.
fopen — 파일 또는 URL을 엽니다. 지원됨 r, rb, rt, w, wb, wt 모드만 지원합니다.
fpassthru — 파일 포인터에 남아 있는 모든 파일을 출력합니다. 지원됨
fputcsv — 라인을 CSV 형식으로 지정하고 파일 포인터에 씁니다. 지원됨
fputs — fwrite의 별칭입니다.
fread — 바이너리 안전 파일 읽기입니다. 지원됨
fscanf — 형식에 따라 파일에서 입력을 파싱합니다. 지원됨
fseek — 파일 포인터에서 찾습니다. 지원됨 읽기 모드를 사용하여 열린 파일만 지원합니다.
fstat — 열린 파일 포인터를 사용하여 파일 정보를 가져옵니다. 지원됨
ftell — 파일 읽기/쓰기 포인터의 현재 위치를 반환합니다. 지원됨
ftruncate — 파일을 지정된 길이로 자릅니다. 지원되지 않음 항상 false를 반환합니다.
fwrite — 바이너리 안전 파일 쓰기입니다. 지원됨
glob — 패턴과 일치하는 경로 이름을 찾습니다. 지원됨
is_dir — 파일 이름이 디렉터리인지를 알려줍니다. 지원됨
is_executable — 파일 이름이 실행 파일인지를 알려줍니다. 지원되지 않음 항상 false를 반환합니다.
is_file — 파일 이름이 일반 파일인지를 알려줍니다. 지원됨
is_link — 파일 이름이 심볼릭 링크인지를 알려줍니다. 지원되지 않음 항상 false를 반환합니다.
is_readable — 파일이 존재하고 읽을 수 있는지를 알려줍니다. 지원됨
is_uploaded_file — 파일이 HTTP POST를 통해 업로드되었는지를 알려줍니다. 지원됨
is_writable — 파일 이름의 쓰기 가능 여부를 알려줍니다. 지원됨 값이 캐시되며 권한 변경을 즉시 반영하지 못할 수 있습니다.
is_writeable — is_writable의 별칭입니다.
lchgrp — symlink의 그룹 소유권을 변경합니다. 지원되지 않음 이 함수는 중지되었습니다.
lchown — symlink의 사용자 소유권을 변경합니다. 지원되지 않음 이 함수는 중지되었습니다.
link — 하드 링크를 만듭니다. 지원되지 않음 이 함수는 중지되었습니다.
linkinfo — 링크 정보를 가져옵니다. 지원되지 않음 항상 -1를 반환합니다.
lstat — 파일 또는 심볼릭 링크의 정보를 제공합니다. 지원됨
mkdir — 디렉터리를 만듭니다. 지원됨
move_uploaded_file — 업로드한 파일을 새 위치로 이동합니다. 지원됨
parse_ini_file — 구성 파일을 파싱합니다. 지원됨
pathinfo — 파일 경로 정보를 반환합니다. 지원됨
pclose — 프로세스 파일 포인터를 닫습니다. 지원되지 않음 이 함수는 중지되었습니다.
popen — 프로세스 파일 포인터를 엽니다. 지원되지 않음 이 함수는 중지되었습니다.
readfile — 파일을 출력합니다. 지원됨
readlink — 심볼릭 링크의 타겟을 반환합니다. 지원되지 않음 항상 false를 반환합니다.
realpath — 정규화된 절대 경로 이름을 반환합니다. 지원되지 않음 항상 false를 반환합니다.
rename — 파일이나 디렉터리의 이름을 바꿉니다. 지원됨
rewind — 파일 포인터의 위치를 되감습니다. 지원됨 읽기 모드에서만 지원됩니다.
rmdir — 디렉터리를 삭제합니다. 지원됨
set_file_buffer — stream_set_write_buffer의 별칭입니다.
stat — 파일 정보를 제공합니다. 지원됨
symlink — 심볼릭 링크를 만듭니다. 지원되지 않음 이 함수는 중지되었습니다.
tempnam — 고유한 파일 이름을 가진 파일을 만듭니다. 지원됨 이 참고를 참조하세요.
tmpfile — 임시 파일을 만듭니다. 지원됨 php://memory와 유사한 메모리 지원 파일을 반환합니다.
touch — 파일의 액세스와 수정 시간을 설정합니다. 지원되지 않음 항상 false를 반환합니다.
umask — 현재 umask를 변경합니다. 지원됨 Cloud Storage 파일에 적용하지 마세요.
unlink — 파일을 삭제합니다. 지원됨

위 표의 파일 상태 함수(file_exists, filemtime, filesize, fstat, is_file, is_dir, is_writable, stat)는 요청 단위로 캐시됩니다. clearstatcache를 호출하여 이 캐시를 삭제할 수 있습니다.

이외에도 다음 PHP 디렉터리 읽기 함수가 지원됩니다.

함수 이름
opendir
readdir
rewinddir
closedir

PHP 5 includerequire 사용

애플리케이션 보안을 위해 Cloud Storage 파일에서 include 또는 require 기능이 기본적으로 중지되지만 다음과 같이 이 기능을 사용 설정할 수 있습니다.

애플리케이션에서 Google Cloud Storage의 PHP 코드를 include 또는 require하려면 php.ini 파일에서 google_app_engine.allow_include_gs_buckets 지시문을 사용하여 이 파일이 포함되는 버킷을 지정해야 합니다.

커스텀 메타데이터 읽기 및 쓰기

Google Cloud Storage에 작성된 파일에 커스텀 메타데이터를 첨부하려면 $options에 메타데이터를 추가한 후 file_put_contents 호출에 사용되는 스트림 컨텍스트를 만듭니다.

이 예시에서 foo라는 메타데이터에는 far 값이 지정되고 또 다른 bar라는 메타데이터에는 boo 값이 지정되며 콘텐츠 유형도 text/plain로 설정됩니다. 스트림 컨텍스트는 다음과 같이 $options의 정보를 통해 생성되고 파일은 file_put_contents()를 통해 메타데이터 및 콘텐츠 유형과 함께 Cloud Storage에 기록됩니다.

$metadata = ['foo' => 'bar', 'baz' => 'qux'];
$options = [
    'Content-Type' => 'text/plain',
    'metadata' => $metadata
];
$context = stream_context_create(['gs' => $options]);
file_put_contents("gs://${my_bucket}/hello_metadata.txt", $newFileContent, 0, $context);

파일의 커스텀 메타데이터와 콘텐츠 유형을 읽으려면 파일에서 fopen을 호출한 후 CloudStorageTools::getContentType()을 사용하여 콘텐츠 유형을 가져오고 CloudStorageTools::getMetaData()를 사용하여 메타데이터를 가져옵니다.

fopen 호출에서 파일 포인터가 반환되면 커스텀 메타데이터와 콘텐츠 유형을 사용할 수 있습니다.

$fp = fopen("gs://${my_bucket}/hello_metadata.txt", 'r');
$content_type = CloudStorageTools::getContentType($fp);
$metadata = CloudStorageTools::getMetaData($fp);

캐시된 파일 읽기

기본적으로 Cloud Storage용 App Engine 스트림 래퍼는 이후 읽기 작업의 성능 향상을 위해 파일 읽기를 memcache에 캐시합니다. 캐싱은 스트림 컨텍스트에서 enable_cache 지시문을 사용하여 해제할 수 있습니다.

성능을 더욱 개선하기 위해 낙관적 캐싱을 사용할 수도 있으며, 이 경우 enable_optimistic_cache 지시문(기본적으로 false로 설정됨)을 사용하여 마지막으로 캐시된 이후 Google Cloud Storage에서 기본 객체가 변경되었는지 여부를 확인하지 않고 캐시에서 파일 객체를 읽습니다. 낙관적 캐싱은 한 번 쓰고 여러 번 읽는 상황에 이상적입니다.

read_cache_expiry_seconds 지시문을 사용하여 다음 읽기 시도 시 객체가 다시 캐시되기 전까지 캐시된 객체가 유효한 상태로 유지되는 시간을 변경할 수도 있습니다. 기본적으로 1시간(3600)으로 설정됩니다.

이 예시에서는 낙관적 캐싱이 사용되었으며 5분 후에 Google Cloud Storage에서 다시 캐시되도록 파일 객체가 구성되었습니다.

$options = [
    'gs' => [
        'enable_cache' => true,
        'enable_optimistic_cache' => true,
        'read_cache_expiry_seconds' => 300,
    ]
];
$context = stream_context_create($options);
file_put_contents("gs://${my_bucket}/hello_caching.txt", $newFileContent, 0, $context);