WindowsでのPHP開発環境

特徴

  • Windows10
  • PHPの複数バージョン対応
  • MySQLの複数バージョン対応
  • バーチャルホスト対応
  • 複数バージョンの共存
  • 仮想化を使わない(Docker、VmWareなど)
  • XAMPPを使わない

複数の案件を円滑に同時進行することを目的とした構成を目指します。

たとえ話

A社のwebサイト、PHP5.4  MySQL5.5
B社のwebサイト、PHP7.1  MySQL5.7
C社のwebサイト、PHP7.2  MySQL5.6

これらの3つの作業を抱えているとします。
どのような作業環境を作ったら良いでしょう。

VmWareやVirtualBoxのような仮想化?
そうやっていた時期もありました。

docker?
お客さんから指定があれば使っている案件もあります。

仮想化はやらない

行き着いたのは仮想化を使わない方法です。

面倒だし

なにが?

切り替えコストが。

A社の作業としていて、電話が鳴ります。
B社のアレをちょっとして欲しい、と。

A社のために開いている画面はそのままにして、
B社の作業をするための画面を開きます。

って、どうします?

仮想化しているサーバを起動します?
割と面倒です。

いちいちサーバを立ち上げたくないです。面倒です。

作業が終わったらサーバを停止・終了させますか?

いちいちサーバを終了したくないです。面倒です。

いきなりブラウザにURLを入力して、いきなり作業に入りたいです。

新しいお仕事、D社のwebサイトが加わりました。

仮想環境を作りますか?面倒です。

ファイルを配置して、データベースをインポートして、バーチャルホストを設定したら、作業に入りたいです。

チーム開発や複数のパソコン

チーム開発のときはどうする?パソコンを2台持っていたら2台に環境を作らないといけない?

そういうときは、本体部分とデータ部分の保存先を分けましょう。
本体部分は共有フォルダとかなんならドロップボックスに入れて他のパソコンと共有できます。
このあたりはもっと進んでいってからの話しですね。ここではとりあえず「可能」ということで。

複数バージョンを共存させる意味

LAMP環境が言われだしたのって2000年代前半だったかな。詳しい時期は分からないけど、僕が初めてLAMP環境で作ったのは2004年のことでした。
これを書いている今日は2018年ももう終わる12月の末。

少なくとも僕が関わりだしてからでも14年経っています。
14年も経つとかなり進化するものです。

ところでWebサイトってどのくらいでリニューアルするでしょう?
3年、5年、10年?

リニューアルするときに以前のWebサイトのデータってどうしますか?

捨てますか?
再利用・再活用しますか?

SQLのダンプもらったけど、手元のMySQLにインポートできない?バージョンが古すぎる?

弊社でも、過去に作ったシステムが古くなって、当時作ってくれた会社は担当者が退職して分かる人が誰もいなくなった、みたいな相談を受けることがちらほらあります。

この話、長くなりそうなので無理やりまとめます。

最新バージョンをインストール
-> 今から新規開発していくWebサイト・Webシステムのため

古いバージョンをインストール
-> 過去に作られた古いシステムのメンテナンスのため
-> 古いバージョンだと最新版で動かないことがあります。

ということで、弊社では古いシステムのメンテナンスや解析も行っております。新規案件も良いけど古いのの再構築とか割と好物です。

完成イメージ

完成イメージというか実際に稼働しているWindowsのディレクトリ構成です。
本記事向けにちょっといじってますが基本的に同じです。

本体向け

本体は「www」というディレクトリ内に入れています。

phpやmysqlなど、バージョンごとにディレクトリを作ってその中に入れています。

よくみると「perl」ディレクトリがありますが、perlも動くようにしています。

一番下の「vhosts」にhttpdのバーチャルホスト設定が入ります。
本体向けに含めていますが、データ向けに入れるかどうかは会社とかチームとの状況によると思います。

データ向け

ログファイルやデータファイルなど「そのパソコン独自のデータ」となるものを入れます。

ドメインの設定をする

方法はいろいろありますが、専用のドメインを取得してワイルドカードにするのが楽です。

IPアドレスとポート番号を使う

http://127.0.0.1/
http://127.0.0.1:80/
http://127.0.0.1:81/
http://127.0.0.1:82/

こんな感じですね。127.0.0.1は自分自身のパソコンを意味します。

プロジェクトごとにポートを変えていく方法がありますが、サイトが増えてくると問題が出てきます。

どのサイトがどのポート番号か覚えてられない

なので、サイト数が増えない前提でなければポート番号を使う方法はやめておいたほうが良いと思います。

専用のドメインを割り当てる

開発向けに専用のドメインを取得し、そこに割り当てます。

例えば「example.com」というドメインを所有しているとします。
※example.comは弊社所有のドメインではありません。example.comについてはこちらをご覧ください

DNSの設定で次のようにします。

a * 127.0.0.1
a *.local-1 192.168.1.1
a *.local-2 192.168.1.2

〇〇.local-1.example.com のアクセスはすべて 192.168.1.1 のコンピュータにつながります。

〇〇.local-2.example.com のアクセスはすべて 192.168.1.2 のコンピュータにつながります。

それ以外の、〇〇.example.com のアクセルはすべて 127.0.0.1 つまり自分自身につながります。

どうしてこうするか?

192.168.1.1 ・・・ 自分の使っているパソコン(開発用)
192.168.1.2 ・・・ 自分の使っているスマホ

こうだったらどうでしょう。そうですね。

スマホから 〇〇.local-1.example.com にアクセスすると、192.168.1.1 つまり開発用のパソコンにつながります。
スマホ向けサイトの実機確認に便利ですね。

SSLのことも考えて

開発環境とはいえ、SSLにも対応しておきたいところです。

ワイルドカードのSSL証明書をとりましょう。
Let’s Encrypt でも良いですが有料のものに比べてちょっと手間があります。

で、最初私も勘違いしていたのですが、ちょっとした罠があります。

*.example.com のワイルドカード証明書を取得したとします。

abc.example.com はOKです。
aaa.bbb.example.com はダメです。

後者の場合は、*.bbb.example.com のワイルドカード証明書になるんです。

a * 127.0.0.1
a *.local-1 192.168.1.1
a *.local-2 192.168.1.2

これだと、ワイルドカード証明書が3つ必要ってことになります。
取得できるならそれがキレイなのかもしれませんが、証明書は1つが良いです。

ので、▼こうします。

a * 127.0.0.1
a sample-local-1 192.168.1.1
a test-local-2 192.168.1.2

「-local-1」の数字のところは、IPアドレスの末尾に合わせてますが、関係者で認識合わせができていればなんでも良いと思います。

自分のパソコンが 192.168.1.1 ならば
sample.example.com
sample-local-1.example.com
のどちらでも自分のパソコンにつながるようにします。

となりの席のBさんが作ってる test は、
test.example.com
test-local-2.example.com
でBさんのパソコンにつながります。

※「-local-」付きはネットワーク内の誰からでも見れる。「-local-」なしは自分自身が見れる。ことになります。

外出先では?

wi-fiにつながるならネット経由で名前解決をして 127.0.0.1 側のドメインが使えます。

wi-fiがなければ、hosts で設定します。

Windows 10向けのリンク