PHP
GAE
GoogleAppEngine
GoogleCloudPlatform

GAE/SE PHP7.2環境で旧来のようなマルチコントローラを実現する

GAE/SE PHP 7.2環境では5.5環境とapp.yamlの書き方が変わっており、フロントコントローラ構成が前提になっています(参照:「GAE/SE PHP 5.5環境と7.2環境のapp.yamlの違い - Qiita」)。

しかし、置いたPHPファイルをそのまま実行したいんだ!ということもあるのではないでしょうか。そうした状況のための設定例を紹介します。

.
├── app.yaml
├── index.php
├── php
│   └── *.php
└── static
    ├── css
    │   └── *.css
    └── js
        └── *.js
app.yaml
runtime: php72
entrypoint: serve index.php

handlers:
- url: /js
  static_dir: static/js
- url: /css
  static_dir: static/css
- url: /
  script: auto
- url: /.*\.php
  script: auto
index.php
<?php
$path = @parse_url($_SERVER['REQUEST_URI'])['path'];
if ($path === '/') {
    $path = 'index.php';
}
$path = sprintf("%s/php/%s", __DIR__, $path);
if (file_exists($path) && is_file($path)) {
    require $path;
} else {
    http_response_code(404);
}

上記のディレクトリ構成とファイル内容にした上で、/foo.phpにアクセスすると./php/foo.phpが、/bar.phpにアクセスすると./php/bar.phpがそれぞれ実行されます。

ダミーのフロントコントローラを置いて実体ファイルをrequireしているだけなんですが、以前と流儀が変わって悩む人もいるかと思ったので記事にしておきます。