【GAE+CI4】CodeIgniter4をAppEngineで使うために必要な設定

書き込み先を変更する必要がある GAEではCI4のデフォルトの書き込み先である、 writable への書き込み権限がありません。そのため、そのままデプロイしてしまうと、CI4の書き込み権限エラーが発生してしまい、アプリ […]

書き込み先を変更する必要がある

GAEではCI4のデフォルトの書き込み先である、 writable への書き込み権限がありません。そのため、そのままデプロイしてしまうと、CI4の書き込み権限エラーが発生してしまい、アプリが動きません。

なので、GAEで唯一書き込みが許可されている tmp ディレクトリに書き込み先を変更する必要があります。書き込み先を変更しただけでは、 tmp ディレクトリに、サブディレクトリが存在しないため、エラーが発生してしまうので、CI4と同様のサブディレクトリを作成する必要があります。

app.yaml

runtime の設定だけでも問題ないですが、画像やCSSなどのアセットは public/assets/css/ 等に配置する想定なので、assetsディレクトリにファイルが存在する場合は静的ファイルとして処理するように設定しています。また、faviconも同じように設定しています。細かいですが、エラーで読み込みに時間が掛かってしまう可能性がありますので、これらはちゃんと設定します。

runtime: php83
service: php-deploy-test

handlers:
  # favicon.icoの静的ファイル処理
  - url: /favicon.ico
    static_files: public/favicon.ico  # publicディレクトリに配置
    upload: public/favicon.ico

  # 静的ファイルを処理するハンドラー
  - url: /assets/(.+)
    static_files: public/assets/\1
    upload: public/assets/(.*)

  # 静的ファイルが見つからない場合、PHPファイルを処理
  - url: /.*
    script: auto

app/Config/Paths.php

デフォルトだと writable を使用する設定になっているので、 /tmp に変更します。ここを書き換えることで、定数の WRITEPATH の値も /tmp に設定されます。なので、他ファイルの書き込み先は変更する必要がありません。ただし、サブディレクトリをCI4のwritableと同じように作る必要がありますので、次の手順でサブディレクトリを作成します。

// 下記に書き換える
public string $writableDirectory = '/tmp';

app/Config/Boot/production.php

writable のサブディレクトリを tmp に再現するための処理です。ここに書いておけば、開発環境と本番環境(GAE)とで処理を分けることができます。ここではサブディレクトリの存在を確認して、存在しないサブディレクトリを作成します。

/** 下記を追記する */

// writableディレクトリ内の必要なサブディレクトリを作成
$writablePaths = [
    '/tmp/cache',
    '/tmp/logs',
    '/tmp/session',
    '/tmp/uploads',
];

// 各サブディレクトリが存在しない場合は作成
foreach ($writablePaths as $path) {
    if (!is_dir($path)) {
        mkdir($path, 0755, true);
    }
}

Git管理をちゃんとやろう

当たり前の話ではありますが、GIt管理で開発環境を develop 、本番環境(GAE)では master というようにブランチをちゃんと分けないと、ローカルでは tmp を用意している訳ではないので、エラーになってしまいます。私は趣味で研究したり開発することが多いのでGit管理の意識が少ないのですが、これを機にちゃんと管理していきます。

GAEはフロントサイド実装のみがいい?

表側の処理をGAE、裏側の処理でGCRという感じでサービスを使い分けるのであれば、GAEはVue.jsのようなフロントサイドのフレームワークを使った方がいいかもしれません。サーバーサイドの処理は全部GCRで完結して、非同期にGAEとGCRの通信を行う方が、スマートです。ですが、個人的にはPHPに精通したプログラマになりたいので、CodeIgniter4を使っても良いのではないだろうかと思ってます。ほぼ趣味ですし。