あとはコードを書くだけ、はじめに作る開発環境構築ベストプラクティス

第2回PHP開発環境の構築[2]―リポジトリ構築からデプロイまで

こんにちは。teratail開発チームの出川幾夫@ikuwowです。

前回はPHPをコマンドラインとWebサーバで実行できる環境の構築手順をまとめました。今回はその後編です。実際にアプリケーションを開発していくためのリポジトリの構成や、デプロイの手順を整える環境構築について説明します。

Composerによるリポジトリ構成

PHPでライブラリを管理するパッケージマネージャとしてComposerがあります。これはRubyにおけるBundlerやiOSアプリケーションにおけるCocoaPodsのように、アプリケーションに依存しているライブラリとその依存関係、バージョン等を管理することができるツールです。

以前はPEARやPECLでサーバにライブラリをインストールするのが主流でした。しかし、アプリケーションの動作がサーバに依存してしまうのと、環境構築に手間がかかり開発者がライブラリの更新を追いづらいという欠点があり、今ではComposerがその役目を代替しています。また、かつてPEARでインストールできた多くのライブラリはComposerでもインストールが可能になっています。

Composerを利用すると、依存関係を1つのファイルにまとめて管理できるのに加え、autoload.phpという1つのファイルをrequireするだけで全てのライブラリをロードすることができます。

/index.php
<?php
require_once 'vendor/autoload.php';

Composerを使ってみる

Composerは公式ページで.phar形式の実行ファイルとして提供されています。リンク内のインストラクションに従ってcomposer.pharをダウンロードします。

これで./composer.pharでComposerが実行可能ですが、単にcomposerコマンドを有効にするには/usr/local/binなどのパスの通っているディレクトリに配置する必要があります。

$ mv composer.phar /usr/local/bin/composer

それでは、まず空プロジェクトcomposertestを作ってその中にcomposer.jsonファイルを作成してみましょう。composer.jsonは依存するパッケージ(ライブラリやフレームワークなど)やそのバージョンを記述するファイルです。composer initでインタラクティブに初期設定を行うことができます。ここでは依存パッケージを指定せずに、いったん空のcomposer.jsonファイルを作ります。

$ mkdir composertest
$ cd composertest
$ composer init


  Welcome to the Composer config generator



This command will guide you through creating your composer.json config.

Package name (<vendor>/<name>) [ikuwow/composertest]:
Description []:
Author [Ikuo Degawa <example@ikuwow.com>, n to skip]:
Minimum Stability []:
Package Type (e.g. library, project, metapackage, composer-plugin) []:
License []:

Define your dependencies.

Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no

{
    "name": "ikuwow/composertest",
    "authors": [
        {
            "name": "Ikuo Degawa",
            "email": "example@ikuwow.com"
        }
    ],
    "require": {}
}

Do you confirm generation [yes]? yes

composer.jsonファイルができたら、早速依存パッケージをインストールしてみます。インストールにはcomposer requireを使います。ここではPHPMailerをインストールしてみます。

$ composer require phpmailer/phpmailer
composer require phpmailer/phpmailer
Using version ^5.2 for phpmailer/phpmailer
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
  - Installing phpmailer/phpmailer (v5.2.16)
    Downloading: 100%

phpmailer/phpmailer suggests installing league/oauth2-google (Needed for Google XOAUTH2 authentication)
Writing lock file
Generating autoload files

この後composer.jsonは以下のように変わります。

composer.json
{
    "name": "ikuwow/composertest",
    "authors": [
        {
            "name": "Ikuo Degawa",
            "email": "example@ikuwow.com"
        }
    ],
    "require": {
        "phpmailer/phpmailer": "^5.2"
    }
}

また、composer.jsonを上記のように直接変更したあとcomposer installコマンドを使うことでもインストールが実行できます。

Composerによってインストールしたパッケージはvendorディレクトリに入ります。ここにあるautoload.phpを読み込むことで、Composerでインストールしたライブラリ全てを参照できるようになります。

以下のコードで動作確認をしてみましょう。

/index.php
<?php
require_once 'vendor/autoload.php';

if (class_exists('PHPMailer')) {
    $mailer = new PHPMailer();
    echo "PHPMailer is included!" . "\n";
} else {
    echo "PHPMailer is not included." . "\n";
}

ここまでComposerの使い方をまとめると、使いたいライブラリをcomposer requireし、作成されたcomposer.jsonファイルとcomposer.lockファイルをコミットする、という手順になります。

composer.lockは、composer.jsonでパッケージが指定された結果、依存関係やマイナーバージョンも含め実際にインストールがされたライブラリの情報が書かれるファイルです。git cloneの直後にcomposer installを使うことで、ここに書かれたのと同じバージョンの同じライブラリがインストールされます。

/vendorディレクトリはバージョン管理の必要が無いので.gitignoreに記述しておきます。composer.jsonに加えてcomposer.lockも忘れずにバージョン管理の対象とします。

.gitignore
/vendor

また、アプリケーションフレームワークを使って開発をする場合は、そのフレームワークに適したファイルやディレクトリを同時に作成してリポジトリを初期化する方法もあります。

$ composer create-project laravel/laravel --prefer-dist

ここまでセットアップしておけば、サーバの設定等をほとんど気にすることなく、ファイルの変更といくつかのコマンドだけでライブラリの依存関係の管理が可能になります。

Webアプリケーションのデプロイ

PHPはビルドが必要ないスクリプト言語なので、PHPでかかれたWebアプリケーションはWebサーバのドキュメントルートに設置するだけで動作します。このためデプロイが非常に簡単です。

ただしgit pullで稼働中のコードを更新したり、その直後のcomposer installが完了するまでには時間がかかるため、それまではアプリケーションが正しく動作しないダウンタイムが生まれてしまいます。

このため、以下のようにgit cloneするディレクトリを複数用意し、composer install等が完了した後にドキュメントルートに指定しているcurrentのシンボリックリンクを新しいものに張り替えるというデプロイがよく行われます。

/your/project/path
|--releases
|  |--20150513120631
|--shared
|  |--...
|--current -> /your/project/path/releases/20150513120631

これはDeployerというPHP製のシンプルなデプロイツールを使うと簡単に実現できます。またCapistranoなどでも同様のことが可能です。

参考: [Laravel] /vendor配下のjsファイルの読み込みについて|teratail
https://teratail.com/questions/4964

終わりに

2回にわたって、PHPの動作と開発の環境の構築方法を見ていきました。PHPは実際に動かしてみるまでの難易度が低く、リポジトリの管理やデプロイもツールが多く存在するのでそこまで気を煩わされることがありません。

はじめにきちっと環境を整えておくと、あとの開発がスムーズに進められます。本格的に開発を行う際にこの記事のセットアップ手順が参考になれば幸いです。

teratail【テラテイル】|思考するエンジニアのためのQAプラットフォーム
https://teratail.com/

おすすめ記事

記事・ニュース一覧