PHP での Cloud Storage の使用

PHP Bookshelf チュートリアルのこのパートでは、Google Cloud Storage に画像を格納する方法を説明します。

このページは、複数のページから構成されるチュートリアルの一部です。最初から設定手順を確認するには、PHP Bookshelf アプリに移動してください。

Cloud Storage バケットの作成

Cloud Storage バケットを作成する手順は次のとおりです。バケットは、Cloud Storage でデータを格納する基本的なコンテナです。

バケットにプロジェクト ID と同じ名前を付けます。

バケットを作成するには:

  1. 次のコマンドを実行します。

    gsutil mb gs://[YOUR-PROJECT-ID]

    [YOUR-PROJECT-ID] を実際のプロジェクト ID に置き換えます。

  2. バケットのデフォルト ACL を public-read に設定します。これによりユーザーは、自身がアップロードした画像を見られるようになります。

    gsutil defacl set public-read gs://[YOUR-PROJECT-ID]

    [YOUR-PROJECT-ID] は、実際のプロジェクト ID に置き換えます。

設定の構成

このチュートリアルの構造化データパートにある settings.yml ファイルを getting-started-php/3-cloud-storage ディレクトリにコピーします。

依存関係のインストール

3-cloud-storage ディレクトリで、次のコマンドを入力します。

composer install

ローカルマシンでのアプリの実行

  1. ローカル ウェブサーバーを起動します。

    php -S localhost:8000 -t web
    
  2. ウェブブラウザで、次のアドレスを入力します。

    http://localhost:8000

これで、アプリのウェブページを閲覧できます。また、表紙の画像を付けて書籍を追加したり、追加した書籍の編集や削除を実行できます。

App Engine フレキシブル環境へのアプリのデプロイ

  1. サンプルアプリをデプロイします。

    gcloud app deploy
    
  2. ウェブブラウザで、次のアドレスを入力します。[YOUR_PROJECT_ID] は実際のプロジェクト ID で置き換えます。

    https://[YOUR_PROJECT_ID].appspot.com
    

    アプリを更新する場合は、最初にデプロイしたときと同じコマンドを使って、更新バージョンをデプロイできます。デプロイを行うと、アプリの新しいバージョンが作成され、それがデフォルトのバージョンに設定されます。古いバージョンはそのまま残り、関連付けられた VM インスタンスも同様に残ります。すべてのアプリ バージョンと VM インスタンスが課金対象のリソースとなるのでご注意ください。

    アプリのデフォルト以外のバージョンを削除することで、コストを削減できます。

    アプリのバージョンを削除する手順は次のとおりです。

    1. GCP Console の [App Engine のバージョン] ページに移動します。

      [バージョン] ページに移動

    2. 削除したい、デフォルト以外のアプリのバージョンの横にあるチェックボックスをクリックします。
    3. ページの上部にある [削除] をクリックし、アプリのバージョンを削除します。

    課金対象のリソースをクリーンアップする方法の詳細については、このチュートリアルの最後のステップにあるクリーンアップ セクションを参照してください。

    アプリケーションの構造

    バイナリデータの構造例

    このアプリケーションは Cloud Storage にバイナリデータ(この場合は画像)を格納します。書籍情報の格納には、引き続き Cloud Datastore、Cloud SQL、MongoDB のいずれかの構造化データベースを使用します。

    コードの説明

    データベースに格納された書籍の一覧を作成するテンプレートが books 配列変数を受信します。配列の書籍ごとに、テンプレートが book.imageUrl で指定された表紙画像を表示します。書籍に imageUrl メンバがない場合には、デフォルトの画像を表示します。

    <div class="media-left">
      {% if book.image_url %}
        <img src="{{book.image_url}}">
      {% else %}
        <img src="http://placekitten.com/g/128/192">
      {% endif %}
    </div>

    個々の書籍を表示するテンプレートも同様の処理を行います。

    <div class="media-left">
      <img class="book-image"
           src="{{ book.image_url ?: 'http://placekitten.com/g/128/192' }}">
    </div>

    書籍情報の入力または編集を行うフォームには、表紙画像の URL を指定する欄があります。

    <div class="form-group">
      <label for="image">Cover Image</label>
      <input type="file" name="image" id="image" class="form-control"/>
    </div>
    
    <div class="form-group hidden">
      <label for="image_url">Cover Image URL</label>
      <input type="text" name="image_url" id="image_url" value="{{book.image_url}}" class="form-control"/>
    </div>

    書籍を削除すると、POST '/books/{id}/delete' ルートのハンドラが書籍の表紙画像を Cloud Storage から削除します。$storage 変数は、src/FileSystem/CloudStorage.php で定義された CloudStorage クラスのインスタンスです。

    if (!empty($book['image_url'])) {
        /** @var CloudStorage $storage */
        $storage = $app['bookshelf.storage'];
        $storage->deleteFile($book['image_url']);
    }
このページは役立ちましたか?評価をお願いいたします。