PHP Advent Calendar 2020 - Day 2

ふうせん🎈 FU-SEN と申します。
Qiita Advent Calendar は様々なところに参加しているのですが、
PHP はこれが初参加らしいです。あれ?
おそらく参加しようと思ってすでに埋まってたのだと思いますが……

PHP は共用レンタルサーバでも対応している事が多く、
比較的動作するサーバが多いプログラミング言語かと思いますが、
少しでも安値で構築して公開しておきたい人もいるかと思います。
んじゃ、無料で PHP が使えるところを紹介しましょう。 ▲Vercel です。


▲Vercel ?

知らない?……えっとですねぇ、2020 年名称が変わったサービスでして、
以前は組織名が ZEIT(ツァイト)、サービス名は Now という名前でした。
これでわかった人がいるかもしれません。▲ は当初から使われていますので。

Now として公開された当初は静的コンテンツのみでしたが、
後の Now v2 で正式動的コンテンツの動作に対応しました。
今は動的コンテンツに使われる用途の方が多いんじゃないかと思います。

無料で使える範囲がとても広いです。 開発者が実験的なコンテンツだったり、
ある程度の開発されたコンテンツは無料で使用できる仕組みにしてあります。
Let’s Encrypt で SSL 化もしますし、独自ドメインも適用できます。

サーバが世界中にあり、その一つとして東京に設置してあります。
アジア初、Vercel 内でも 5 ヶ所目に設置しています。
その仕組みは?……実は AWS や GCP を使用してあって、
使用状況によってサーバを動的に変化させているわけです。
クラウドサービスをフル活用しているんですね。

公開方法は CLI を用いて vercel コマンドで公開するか……

または GitHub・Gitlab・Bitbucket による Git 連動が使用できます。
開発者らしくシェル・ターミナルからコマンドで簡単に公開する事ができます。


▲Vercel で PHP を動かす方法

「あれ?でも Vercel って PHP は対応してないんじゃないの?」

ええ、公式には次の対応なのです。

  • Node.js
  • Go
  • Python
  • Ruby

これなら PHP も対応しててもおかしくなさそうなのですが、
公式には対応していません。

でもご安心を。 Community Runtimes として PHP が動作する仕組みがあるんです。

動かすためにはちょっと工夫が必要です。
公開するディレクトリ・フォルダを用意します。その直下の vercel.toml を作成し、
次のテキストを入れます。

{
  "regions": ["hnd1"],
  "functions": {
    "api/*.php": {
      "runtime": "[email protected]"
    }
  },
  "routes": [
    { "src": "/(.*)", "dest": "/$1" },
    { "handle": "filesystem" },
    { "src": "/.*", "dest": "/404.html" }
  ]
}

regions は東京サーバ hnd1 を設定します。日本参照向けですね。
無料で動的コンテンツの場合は 1 ヶ所指定になるため、指定しておくと良いです。

functions は api/ 内にある .php ファイルで PHP を実行します。
動的ファイルは api/ 内での実行が必須となります。

routes はファイルがない場合に 404.html を表示する設定です。
例えば 404.html の代わりに api/index.php とする事もできます。

vercel.json は Apache の .htaccess に相当する部分で、
HTTP ヘッダの追加や転送など、細かく制御が可能です。

api/ ディレクトリ(フォルダ)を作成し、更にその中に phpinfo.php を作成し、
その中に入れます。

<?php
phpinfo();

では公開してみましょう。
公開するのは CLI で公開するか、Git への公開になります。
Git への公開はプロジェクトを連携させた状態で git push で更新すれば良いので、
(vercel.json が入っている必要があります)
ここでは CLI を紹介しておきましょう。

vercel --prod

とします。--prod がない場合は公開前の確認向けです。

vercel –prod を実行

では Web サイトで確認!(ここでは api/info.php にしています)

phpinfo を表示

phpinfo が公開されています。PHP が動作しているのを確認できました。

GitHub でのサンプル。WHOIS サーバの接続として PHP を使用しています。
特定サーバの ポート 43 にドメイン名を送出すると、テキスト文が返ってきます。

もうちょっと詳細な説明はこちらで記載してあります。


無料で PHP が使えるサービスは他にもあるのですが……

  • Heroku
    → 公開サーバが欧米で、無料は最大 1 プロジェクト常時。
  • Google App Engine(Google Cloud Platform)
    → バージョンが古めで、気がつけば課金される可能性がある。
  • Google Cloud Run(Google Cloud Platform)
    → App Engine よりも課金がはやく、デプロイの手間がかかる。
  • Fly(fly.io)
    → Cloud Run に近いが、日本語情報が少なく、デプロイに時間がかかる。
  • Glitch
    → OS パッケージそのままでバージョンが古い。アメリカのサーバ。

一長一短なところがあります。

Fly と Glitch は使用経験者が少ないと思います。紹介ページをリンクしておきます。

いずれも Node.js など、他の言語がメインで紹介されているサービスですね。

▲Vercel はこれらに比べると、敷居が低くて、東京サーバもあるので、
使いやすいと思っていて、今回紹介しています。
気になる人は上に紹介したサービスも試してみて下さい。


追加 2021/02/26

PHP Advent Calendar 2020 では PHP8 の話題が多かったので、
おそらく気にしている人もいるかと思います。

2021年1月2日 に vercel-php が 0.4.0 になっていて、
このタイミングで PHP8 で動作可能になっています。
……はい、 すでに ▲Vercel で PHP8 が使えます。

vercel.json の runtime で記載している
vercel-php のバージョンを変更して下さい。

{
  "functions": {
    "api/*.php": {
      "runtime": "[email protected]"
    }
  }
}

これで vercel する事で PHP8 になっているはずです。

phpinfo を表示

…… vercel --prod って入れてない理由わかりますよね?
いきなり PHP7 から PHP8 に変えて、動かない可能性がありますからね。
まずは別の URL で表示できるようにして、動作を確認してから
vercel --prod で本番環境に反映するのですよ。
▲Vercel はそこまで考えて作られてあるんです。


PHP Advent Calendar 2020

PHP Advent Calendar 2020 | Qiita