PHPアプリケーションのデプロイ方法
この記事では、ワールド・ワイド・ウェブを動かす最も人気のあるスクリプト言語の一つであるPHPについて説明します。PHPの長所、短所、デプロイオプションを探ります。
この記事を読み終わる頃には、シンプルなPHPアプリケーションをブートストラップし、Docker化し、Back4app Containersにデプロイできるようになっているでしょう。
Contents
PHPの概要
PHP(PHP: HyperText Processorの略)は、人気のあるフリーの汎用スクリプト言語です。1993年にRasmus Lerdorfによって作成され、その後1995年にリリースされました。
PHPは当初Web開発用に設計されましたが、現在ではサーバーサイドスクリプティング、コマンドラインスクリプティング、デスクトップアプリケーションの作成にも使用されています。
PHPの素晴らしい点は、HTMLに直接埋め込むことができることです。(CやPerlで見られるような)長いコマンドを使ってHTMLを出力する必要はありません。簡単な例を示します:
<!DOCTYPE html>
<html lang="en">
<head>
<title>My first PHP website</title>
</head>
<body>
<?php
$cool_scripting_language = "PHP";
echo "$cool_scripting_language is a cool scripting language!";
?>
</body>
</html>
ユーザーがこのサイトをリクエストするとPHPが実行され、処理されたHTML出力だけが返される。私たちの場合は、「PHPはクールなスクリプト言語です!」というメッセージです。PHPは(JavaScriptのように)ブラウザで実行されるのではなく、サーバー側で実行されます。
PHPが完全なオブジェクト指向言語であるかどうかは議論の余地があります。しかし、名前空間、クラス、オブジェクトといったオブジェクト指向の標準的な機能はサポートしています。
この記事を書いている時点では、PHPの最新の安定バージョンは8.2ですが、多くのPHPアプリケーションは古いリリースのままです。
一部の開発者は、PHPは死につつあると主張しているが、そうではない。W3Techsの調査によると、PHPは現在、サーバーサイドのプログラミング言語が知られているウェブサイト全体の77.4%を動かしています。
このスクリプト言語は、Facebook、Wikipedia、Mailchimp、さまざまな CMS ソフトウェアなどのトラフィック量の多い Web サイトでも使用されており、過去には YouTube でも使用されていました。
PHPの利点
良いパフォーマンス
PHPは、ASP.NETや JSP、Pythonといった他のサーバーサイドスクリプティング 言語よりも高性能です。いくつかのベンチマークでは、PHPはPythonよりも3倍高速であることが示されています。
PHPは、HTMLページの生成、フォーム送信の処理、データベースとのやり取りなど、ウェブ関連のタスクを処理するのが得意です。
逆に、重い計算タスクや複雑なアルゴリズムには、PHPよりも最適な選択肢がある。
クロスプラットフォーム
PHPはプラットフォームに依存しません。Windows、Linux、Unix、Macなど様々なプラットフォーム上で動作します。さらに、Apache HTTP、Caddy、Nginx、LiteSpeedなど、ほとんどすべての一般的な Webサーバーと互換性があります。
Czarek Tomczak氏のphpdesktopのおかげで、人気のスクリプト言語がデスクトップアプリケーションの開発にも使えるようになった。このライブラリは、PHP用のElectronと考えることができます。phpdesktopアプリケーションはWindowsやLinux上で動作しますが、Mac OS Xでは動作しません(まだ)。
データベースサポート
スクリプト言語は、SQLやNoSQLデータベースを含む様々なデータベースをサポートしています。PHPで最もよく使われるデータベースはMySQL(LAMPスタック)ですが、 PostgreSQLやその他のデータベースを使うこともできます。
PHPの抽象化レイヤーやベンダー固有のデータベース拡張機能は、すべて公式サイトで見ることができる。
元気なエコシステム
PHPは、その活気あるエコシステムのおかげで、同じくらい人気があります。多くの素晴らしいPHPフレームワークは、開発プロセスを大幅にスピードアップし、コードベースを簡素化し、よりクリーンで標準化されたコードを書くように導きます。
本稿執筆時点で最も人気のあるPHPフレームワークは以下の通りである:
その他の素晴らしいフレームワークやリソースについては、GitHubのawesome-phpをチェックしてほしい。
WordPress、Joomla、Drupal、Magentoなど、PHPを利用したCMSもたくさんある。
簡単に学べる
PHPはシンプルな構文を持つ初心者に優しい言語です。ワールド・ワイド・ウェブ(WWW)の基本、HTML、CSS、JavaScriptに慣れ親しんでいれば、比較的簡単に習得することができます。多くの開発者がPHPを書くことができますが、きれいなコード規約に従った 保守性の高いPHPを書ける開発者はごく少数です。
PHPの限界
限られたデバッグ・ツール
PHP はエラーの処理が苦手で、他の一般的なプログラミング言語に比べて デバッグツールが不足しています。高度なデバッグが必要な場合は、Xdebug やKrumo、Kint といったサードパーティ製のソフトウェアを使用することになるでしょう。
PhpStormや Visual Studioのような人気のあるIDEには、PHPデバッグツールが組み込まれています。
ルーズタイプ
上述したように、PHPはプログラミング言語ではなくスクリプト言語です。スクリプト言語の最も一般的な特徴の1つは、型付けが緩いということです。
つまり、変数の型を使用する前に明示的に宣言する必要がない。その上、実行中にいつでも変更することができる。
この結果、PHPアプリケーションはエラーが発生しやすくなり、デバッグが困難になります。
セキュリティの欠陥
長年にわたり、PHPアプリケーションは様々なハッカー攻撃の標的となってきました。これは主に、PHPがオープンソースであり、新規開発者の参入コストが低いためです。
最もよく知られているPHPの脆弱性には、SQLインジェクション、クロスサイトスクリプティング(XSS)、クロスサイトリクエストフォージェリ(CSRF)、リモートコード実行(RCE)などがあります。
これらの脆弱性は、セキュアなコーディングを実践することで防ぐことができることを忘れないでください。常に入力をサニタイズし、ユーザが提供した入力を決して実行しないようにしてください。
バニラPHPは時代遅れ
バニラPHP(ライブラリやフレームワークを使わないPHPのこと)は、最新のアプリケーションを構築するにはかなり時代遅れです。安全なアプリケーションを高速に構築するには、フレームワークを利用する必要があります。
PHPの配置オプション
PHPアプリケーションはさまざまなプラットフォームにデプロイすることができます。PHPアプリケーションをデプロイするための最も一般的なクラウドモデルは以下の通りだ:
- サービスとしてのインフラストラクチャー(IaaS)、
- サービスとしてのプラットフォーム(PaaS)、
- サービスとしてのコンテナ(CaaS)。
PHPアプリケーションのデプロイに最適なクラウドモデルは存在しない。最終的には、プロジェクトの要件、予算、抽象化したいレベルに応じて選択することになる。
通常、開発チームはPaaSまたはCaaSを選択します。これは、管理が容易で、IaaSよりもそれほど高価ではないためです。では、優れたPHPホスティングベンダーをいくつか見ていきましょう。
Back4app Containers
Back4app Containersは、Back4appが提供する優れたCaaS(Containers as a Service)です。このプラットフォームにより、開発者はドッカー化されたアプリケーションを構築、拡張、迅速にデプロイできる。
Back4app Containersへのアプリケーションのデプロイは、GitHubリポジトリをインポートしてボタンをクリックするだけと簡単です。このプラットフォームは、優れた継続的インテグレーションとデプロイシステムを備えており、ノーダウンタイムのデプロイ、リアルタイムのデプロイ追跡などをサポートしています!
Back4app Containersのもう一つの利点は、小規模アプリケーションのホスティングに最適な無料ティアです。アプリケーションの規模が大きくなれば、シンプルで予測可能な料金プランに従ってプレミアム層にアップグレードすることができます。
Google Cloud Run
Google Cloud Runは、コンテナ化されたアプリのデプロイとスケーリングのための、完全に自動化されたCaaS(Containers as a Service)プラットフォームだ。2019年に一般公開され、多くの人気を集めている。
Cloud Runは、特に他のGCP製品に慣れている人であれば、比較的簡単に使うことができる。Cloud Runの利点には、無料のSSL証明書、他のGCPソリューションとの優れた統合、ゼロスケールなどがある。
本稿執筆時点で、グーグルは新規ユーザーに300ドルの無料クレジットを提供している。
Heroku
Herokuは、Platform as a Service(PaaS)ソリューションの草分け的存在である。2007年に設立され、現在も高い人気を誇っています。
PHP、Java、Node.js、Go、Scala、Pythonなど、さまざまなプログラミング言語を幅広くサポートしている。このプラットフォームは、洗練されたユーザーフレンドリーなUIを持ち、優れたスケーラビリティを実現し、膨大な種類のアドオンを提供している。
Herokuは以前、無料プランと無料のPostgreSQLとRedisインスタンスを提供していたが、詐欺やボットに関する懸念のため、2022年に中止することを決定した。とはいえ、Herokuはアプリをデプロイするための優れたプラットフォームであることに変わりはない。
AWS Elastic Beanstalk
AWS Elastic Beanstalk(EB)は、優れたPlatform as a Service(PaaS)ソリューションだ。成熟し、十分にテストされたプラットフォームで、2011年に設立された。EBはGo、Java、Node.js、PHP、Python、Rubyをネイティブにサポートし、ドッカー化されたアプリケーションをデプロイできる。
Elastic Beanstalkの最も優れた点は、AWS S3、AWS RDS、AWS CloudFrontなど、他のAWSソリューションと組み合わせることができる点だ。AWSは新規顧客に無料ティアを提供している。
PHP導入プロセス
このセクションでは、シンプルなLaravelウェブアプリをブートストラップしてBack4app Containersにデプロイする方法を見ていきます。
前提条件
コンテナ化技術に馴染みのない方は、「コンテナとは何か?
Laravelとは?
Laravelは、表現力豊かでエレガントなシンタックスを使って素早くアプリを構築できる優れたPHPフレームワークです。その結果、クリーンで簡潔なコードが完成します。
このフレームワークは、モデル-ビュー-コントローラ(MVC)アーキテクチャパターンに基づいている。何よりも、Laravelは完全にフリーでオープンソースです。
2011年にリリースされ、現在最も人気のあるPHPフレームワークの一つである。その柔軟性により、どのようなタイプのウェブアプリケーションでも構築することができます。
Laravelの利点
- パフォーマンスと柔軟性。
- Eloquent ORMを介して)データベースでの作業を簡素化します。
- 組み込みの認証と承認。
- 統合されたセキュリティ対策(CSRF、XSS)。
Laravelの代替には、Symfony、CodeIgniter、CakePHP、Laminas Projectなどがあります。
アプリ作成
以下の手順では、Composerがインストールされている必要があります。お持ちでない場合は、公式ウェブサイトからダウンロードしてください。
まず、Composerコマンドラインインターフェイスで新しいLaravelプロジェクトを作成します:
$ composer create-project laravel/laravel sample-app
sample-appは
自由にカスタム名で置き換えてください。
このコマンドは、新しいLaravelプロジェクトとデフォルトのディレクトリ構造を作成します。その上、composer installで
すべての依存関係をインストールします。このコマンドにかかる時間は長くても3分程度です。
完了すると、以下のようなディレクトリ構造になっていることに気づくだろう:
sample-app/
├── app/ contains the core code of your application
│ ├── Console
│ ├── Exceptions
│ ├── Http
│ ├── Models
│ └── Providers
├── bootstrap is used to bootstrap the framework
├── config contains all your configuration files
├── database contains database factories, migrations, seeders
├── public contains your index.php and static assets (JS, images, CSS)
├── resources contains all your views and templates (along with raw assets)
├── routes is used to define all your application endpoints
├── storage contains logs and other auto-generated stuff
├── tests can be utilized for automatic testing
└── vendor contains your Composer dependencies
次に、以下のコマンドで開発サーバーを実行する:
$ php artisan serve
INFO Server running on [http://127.0.0.1:8000].
Press Ctrl+C to stop the server.
最後に、お気に入りのウェブブラウザを開き、http://localhost:8000/。デフォルトのLaravelインデックスページが表示されるはずです。
アプリの修正
このセクションでは、新しいAPIエンドポイントを登録することで、アプリを少し修正する。
前のセクションで述べたように、すべてのルートはroutesフォルダで定義されます。routesフォルダには以下のファイルが含まれています:
routes/
├── api
├── channels
├── console
└── web
webディレクトリはエンドユーザー・ルートを定義し、apiはAPIルートを定義し、consoleはコンソール・コマンドを定義し、最後にchannelsはイベント放送チャンネルを定義する。
Laravel 5.3以前は、app/http/routes.phpに1つのroutesファイルがあるだけでした。
routes/api.phpに移動し、以下のように新しいAPIエンドポイントを登録する:
<?php
// routes/api.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});
// new endpoint
Route::get('/', function () {
return response()->json([
'detail' => 'Back4app Containers rocks!',
]);
});
最高だ。
開発サーバーを再び起動し(まだ起動していない場合)、http://localhost:8000/。デフォルトのLaravelページが表示されるはずですが、/api/に移動すると、以下のメッセージが表示されるはずです:
{
"detail": "Back4app Containers rocks!"
}
Dockerizeアプリ
このセクションでは、Dockerfileを使ってLaravelアプリをドッキングします。
ドッカーファイル
Dockerfileは、Docker EngineがDockerイメージをビルドして実行するために必要なすべての命令を含むプレーンテキストファイルです。命令は通常すべて大文字で記述され、その後にカスタム量の引数が続きます。例
INSTRUCTION arg1 arg2 ... argn
プロジェクト・ルートに以下の内容でDockerfileを作成する:
FROM php:8.1-apache
# Set the working directory
WORKDIR /var/www/html
# Install the necessary libraries
RUN apt-get update && apt-get install -y \
libonig-dev \
libzip-dev
# Install PHP extensions
RUN docker-php-ext-install \
mbstring \
zip
# Copy over the Laravel project
COPY . .
# Install Composer along with the dependencies
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
RUN composer install
# Change ownership of our applications
RUN chown -R www-data:www-data /var/www/html
# Copy over the .env file and generate the app key
COPY .env .env
RUN php artisan key:generate
# Expose port 80
EXPOSE 80
# Adjusting Apache configurations
RUN a2enmod rewrite
COPY apache/apache-config.conf /etc/apache2/sites-available/000-default.conf
このDockerfileは、ベースイメージとしてphp:8.1-apacheを
使用し、必要なOS依存関係をインストールし、プロジェクトをコピーオーバーします。その後、Composer経由でPHPの依存関係をインストールし、Laravelキーを生成し、ポート80を公開し、最後にApacheの設定をコピーオーバーします。
Dockerfileの詳細については、Dockerfileリファレンスを参照してください。
.dockerignore
.dockerignoreファイルを使ってイメージサイズを小さくすることができます。このファイルは.gitignoreファイルと同様の働きをします。イメージに含めない特定のファイルやディレクトリを省略することができます。
プロジェクトルートに、以下の内容の.dockerignoreファイルを作成する:
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/storage/*.key
/vendor
.phpunit.result.cache
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode
.dockerignoreファイルは必要に応じて自由に変更してください。
ビルド、実行、テスト
イメージをビルドしようとする前に、Dockerがインストールされていることを確認してください:
$ docker --version
Docker version 20.10.22, build 3a2c30b
それを確認したら、イメージを構築することができる:
$ docker build -t laravel-sample:1.0 .
コマンドの概要
docker buildは
イメージのビルドに使われる。-t laravel-sample:1.0は
画像をタグ付けします(画像名は通常、name:versionの
構造を持っています)。ビルド・コンテキストを
指定する。私たちの場合はプロジェクト・ルートだ。
次に、新しく作成したイメージを使ってコンテナをスピンアップする:
$ docker run -p 80:80 --name laravel-sample-container -d laravel-sample:1.0
コマンドの概要
docker run
はコンテナをスピンアップするのに使われる。-p 80:80
ホストのポート80を
コンテナの80に
バインドする。--name laravel-sample-containerは
コンテナ名を指定します。-dは
デタッチモード、つまり端末を占有せずに画像を実行する。laravel-sample:1.0は
、Dockerエンジンにどのイメージを使うべきかを伝えます。
実行中のコンテナを確認すると、laravel-sample-containerが
表示されているはずです:
$ docker ps
CONTAINER IMAGE COMMAND CREATED PORTS
b0bfbd laravel-sample:1.0 "docker-php..." 2s ago 0.0.0.0:80->80/tcp laravel
最後に、お気に入りのウェブブラウザでhttp://localhost/、アプリが表示されるかどうかを確認する。
GitHubにプッシュする
アプリをBack4app Containersにデプロイするには、まずソースコードをGitHubにアップロードする必要があります。Back4app ContainersはCI/CDシステムを採用しており、コードを特定のブランチにコミットすると自動的にデプロイされます。
以下の手順では、GitHubのアカウント(とGitのインストール)が必要です。
まずhttps://github.comにアクセスし、新しいリポジトリを作成する:
次に、適当な名前を選び、他はデフォルトのままにしておきます。そして、”Create repository “ボタンをクリックして、リポジトリを作成します:
リポジトリを作成したら、リモートURLを取得します:
ローカル・プロジェクトに戻り、コマンドラインを開く。コードを GitHub にプッシュするには、まずローカルの Git リポジトリを次のようにして初期化する必要があります:
$ git init
次に、すべてのファイルをVCSし、新しいコミットを作成する:
$ git add .
$ git commit -m "init"
最後に、コードをリモコンにプッシュする:
$ git push origin master
これで完了です!GitHub リポジトリのページを更新すると、すべてのファイルがリモートの Git リポジトリにプッシュされたことがわかります。
アプリのデプロイ
Back4app Containersにアプリをデプロイするには、まずログインする必要があります(アカウントをお持ちでない場合はサインアップしてください)。ログインするとアプリのダッシュボードページにリダイレクトされます。
そして「Build new app」ボタンでアプリの作成プロセスを開始する:
コンテナ化されたアプリをデプロイするので、”Containers as a Service “を選択する:
次に、GitHubをBack4appのアカウントに接続し、前のステップで作成したリポジトリをインポートします。
アプリにカスタム名を付け、他はデフォルトのままにしておく。
アプリを作成するには、”Create App “をクリックします。クリックすると、Back4appが自動的にGitHubからソースコードを取得し、Dockerイメージの構築プロセスを開始します。数分後、アプリのステータスが “Ready “に変わります。
そうしたら、左のリンクからブラウザでページを開いてください。
それだけだ!
結論
最後に、PHP、その利点、欠点、デプロイオプションについて学びました。Laravelアプリケーションをブートストラップし、Back4appにデプロイする方法を知ることができました。
チュートリアルを通して見たトピックは、Laravelフレームワークの表面をほとんどかすめただけです。Laravelのドキュメントをチェックすれば、いつでももっと学ぶことができます。
ソースコードはback4app-containers-phpのGitHubリポジトリで公開されています。
今後のステップ
- Laravelのアーキテクチャコンセプトと Eloquent ORMをご覧ください。
- マネージドMySQLデータベースを立ち上げ、Back4app Containersアプリと接続します。
よくあるご質問
PHPとは何ですか?
PHPは人気のある無料の汎用スクリプト言語です。ウェブ用に設計されましたが、サーバーサイドスクリプト、コマンドラインコマンド、デスクトップアプリケーションにも使用できます。現在、PHPはウェブの約80%を支えており、Facebook、Wikipedia、Slackなど、多くの高トラフィックなサイトで使用されています。
PHPの利点は何ですか?
– 高いパフォーマンス
– クロスプラットフォーム
– データベースサポート
– 活気のあるエコシステム
– 学習が簡単
PHPの欠点は何ですか?
– 限られたデバッグツール
– ゆるい型付け
– セキュリティの欠陥
– ベーシックなPHPは時代遅れ
PHPアプリをデプロイする方法は?
1. PHPアプリケーションをコーディングします。
2. アプリをDocker化し、ローカルでテストします。
3. ソースコードをGitHubにプッシュします。
4. Back4app Containersアカウントを作成します。
5. GitHubリポジトリをインポートし、「デプロイ」をクリックします!