高度な 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 内で元のオブジェクトが変更されたかどうかを確認せずに、キャッシュからファイル オブジェクトを読み取ることができます。楽観的キャッシュは、書き込みが 1 回限りで何回も読み取りを行う場合に最適です。
metadata 連想配列など。 ['foo' => 'far', 'bar' => 'boo'] カスタム メタデータの読み取りと書き込みをご覧ください。
read_cache_expiry_seconds キャッシュに保存されているオブジェクトの有効期間(秒) read_cache_expiry_seconds directive を使用して、キャッシュされたオブジェクトの有効期間を変更できます。この期間が経過すると、オブジェクトが次の読み取り時に再度キャッシュに保存されます。デフォルトでは 1 時間(3600)に設定されています。
writable_cache_expiry_seconds バケットの書き込み可能状態がキャッシュに保存される秒数 パフォーマンスを向上させるため、Cloud Storage ストリーム ラッパーはバケットの書き込み可能状態をキャッシュに保存します。バケットの ACL が変更されたときに、さまざまな stat() 関連の関数から返された書き込み可能ビットが一時的に同期しなくなる可能性があります。デフォルトでは、これは 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 を開きます。 サポート対象 サポートされているモードは、rrbrtwwbwt のみです。
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 — シンボリック リンクのグループ所有権を変更します。 サポートされていません。 これは無効です。
lchown — シンボリック リンクのユーザー所有権を変更します。 サポートされていません。 これは無効です。
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_existsfilemtimefilesizefstatis_fileis_diris_writablestat)はリクエストごとにキャッシュされます。このキャッシュをクリアするには、clearstatcache を呼び出します。

また、次の PHP ディレクトリ読み取り関数がサポートされています。

関数名
opendir
readdir
rewinddir
closedir

PHP 5 includerequire の使用

アプリケーションのセキュリティを維持するため、Cloud Storage ファイルの includerequire の機能はデフォルトで無効になっていますが、次のようにして有効にできます。

アプリケーションで Google Cloud Storage の PHP コードの include または require を行うには、php.ini ファイルで google_app_engine.allow_include_gs_buckets ディレクティブを使用し、これらのファイルが含まれているバケットを指定する必要があります。

カスタム メタデータの読み取りと書き込み

Google Cloud Storage に書き込むファイルにカスタム メタデータを追加するには、file_put_contents 呼び出しに使用するストリーム コンテキストを作成する前に、メタデータを $options に追加します。

この例では、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 ディレクティブを使用すると、キャッシュへの保存はオフになります。

パフォーマンスのさらなる向上のために、楽観的キャッシュを有効にすることもできます。これにより、元となるオブジェクトが最後にキャッシュされてから Google Cloud Storage で変更されたかは確認せずに、enable_optimistic_cache ディレクティブ(デフォルトでは false に設定)を使用して、キャッシュからファイル オブジェクトを読み取ります。楽観的キャッシュは、書き込みが 1 回限りで何回も読み取りを行う場合に最適です。

また、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);