php5とphp7を同居させた上でホスト名で使い分ける

どーせ今から新しいことをやるなら php7を使いたいよね
でも、今までのプロジェクトはphp5で動かし続けなくちゃいけないんだ。
どうしよう!助けてググえもーん!!!

助けを求めても php5と7を同じ環境で動かすという事例は見つからず
見つかったのは4と5を同じ環境で動かすとか 4.4と5.2と5.3を同時に動かすとかいう記事のみ。

そのあたりの記事を参考に頑張ってみる。
ぼくだけの力で、問題を解決できないと、ググえもんが安心して帰れないんだ!

=== 現在の状況 ===

かなり昔にxamppを導入した
Apache2.4.17 導入済み
php5.6.23 導入済み
ブラウザからlocalhostでphpinfo()とか見れる

=== 今日の目標 ===
同じPC上で基本的にはphp5で動くけど
特定のホスト名の場合はphp7で動く、とかにしたい。

1. まずphp7のダウンロードだ

今現在での最新バージョンは7.2っぽいのでそれを。
Apache2系なので thread safe な方ね。(Apache1の場合はnonThreadSafeじゃないとダメみたい)
また、32bit版と64bit版があってPCは64ビットだから迷わず64を落としたんだけど
apacheが32ビットじゃないとダメ、って怒られた。
これは怒られてから違う奴を落としてもいいのかもしれない。

2. 解凍して格納だ

適当な場所に回答して適当な場所に持ってくよ
僕はxamppを使ってるので
c:\xampp 直下に配置して
さらにフォルダ名が長いので php72 に改名した。

3. 何かあった時のためにconfをバックアップだ

c:\xampp\apache\conf をコピーして conf_ って作ったよ。
conf_bkでもconf_bakでもいいけど、作業が終わったらちゃんと消すのよ?

4. まずは7だけ起動させてみよう

アパッチの設定ファイルはc:\xampp\apache\conf の中にあります。
php5を呼び出すための設定はおそらくこの中にある、とにらんで
「php」で全ファイルの中身を検索するとそれっぽいファイルが見つかりました。

php5モジュールの読み込み

LoadFile "C:/xampp/php/php5ts.dll"
LoadFile "C:/xampp/php/libpq.dll"
LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

実際に起動するPHPファイルの指定


    PHPINIDir "C:/xampp/php"

と、こんな感じ。
下のIfModuleはphp5_moduleを呼んでいなければ呼ばれないので
上の方の3行だけコメントアウトして
4行追記

#LoadFile "C:/xampp/php/php5ts.dll"
#LoadFile "C:/xampp/php/libpq.dll"
#LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

LoadFile "C:/xampp/php72/php7ts.dll"
LoadFile "C:/xampp/php72/libpq.dll"
LoadModule php7_module "C:/xampp/php72/php7apache2_4.dll"
PHPINIDir "C:/xampp/php72"

そしてapacheの再起動をして
ブラウザからphpinfo()で PHPのバージョンを確認
(コマンドで確認しても意味がないので、念のため。)

バージョンが7.2.0RC3ってなってる!OK!
(ここで気が付いたけどRCって正式バージョンではないらしい。でも今更戻る気はない!)

5. もう少し掘り下げて考えてみよう。トライアンドエラーで。

7と5を切り替えるラインはどこにあるのか。
どこまでやったらエラーになって、どこまでならセーフなのか。
キーになるディレクティブは
それぞれのバージョンごとに
LoadFile~が2つ、LoadModule,PNPINDirが一つづつ。
思い切ってIfを外してくっつけてテストをするうちに

・LoadFile~は4つ全部書きっぱなしで問題ない
・LoadModuleは2回呼んでもいいが、先に読んだ方が優先される
・PHPINDirを二回呼ぶとエラーになるが、5のでも7のでも構わないようだ。

という事がわかった。

でも、PHPINDirについてはちょっと怖い気がするな。

6. いろいろ頑張ったけどダメだったのでもうちょっと勉強する

ここでの登場人物(ディレクティブ(httpd.confに書かれる文
LoadModule
 モジュールを読み込む
SetHandler
 ハンドルを指定するで囲んで特定のファイルとハンドルを紐づける
 上書きされるので、後にあるほうが優先
FileMatch
 正規表現でディレクティブを実行したいファイルを指定できる

・ハンドルって何?
あるファイルを特定の処理に紐づけをする役目を持っている
たとえば


    SetHandler application/x-httpd-php

だったら ファイル名が .php で終わるものは
application/x-httpd-php が処理できる人が処理してね
という設定になる。
この場合は application/x-httpd-php がハンドル名?タイプ?って呼ぶらしい。

・そしたらハンドルタイプとモジュールを紐づけは?
なんかモジュールに書いてあるっぽい。
モジュールを無理やりテキストエディタで開くとバイナリ的なものの中に

php5apache2_4.dll
Authorization application/x-httpd-php application/x-httpd-php-source

php7apache2_4.dll
Authorization application/x-httpd-php application/x-httpd-php-source php7-script text/html

と書いてあるところが見つかりました。
という事は LoadModuleした時に、
Module自身が「あ、僕はコレとコレ担当しますわ」と
自己申告する方式じゃないかと推測できるという事ですね。

ただ、php7には php7-script と自分が7であることを宣言するところがありますが
5の方にはありません。しかも二つとも7と被ってます。

両方宣言したときにどちらが優先されるかについては
最初にLoadModuleした方が優先される
という事が 5. の実験でわかっています。

7. さあやってみよう

まずポイントを整理します。
・最初にLoadFileを4つ全部呼ぶ
・次にLoadModuleを 5->7 の順番で呼ぶ
・SetHandler で 全体のphpファイルと php5を紐づける
・PHPINIDirはとりあえず削除する(次の章でやる)
・php7を使用したいVirtualHostのVirtualHostディレクティブにSetHandlerで php7-script を紐づける
※3工程目のphp5用のSetHandlerよりも後に記載しないとダメ
・apache再起動して確認

ファイルの読み込み順番も重要なので確認します。
これはあくまで僕の環境下の話なので、え?俺の違うんだけど!って言う人は
がんばってそれっぽくうまいことやってください。

httpd.confを読む
httpd.conf中に Include conf/extra/httpd-vhosts.conf があるのでそれを読みに行く
httpd.conf中に Include conf/extra/httpd-xampp.conf があるのでそれを読みに行く
httpd.confを最後まで読み切る

ここまで確認できたらファイルの編集をします

httpd.conf

LoadFile "C:/xampp/php/php5ts.dll"
LoadFile "C:/xampp/php/libpq.dll"
LoadFile "C:/xampp/php72/php7ts.dll"
LoadFile "C:/xampp/php72/libpq.dll"

LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"
LoadModule php7_module "C:/xampp/php72/php7apache2_4.dll"

#↓コメントアウト
#PHPINIDir "C:/xampp/php"

====
extra/httpd-vhosts.conf


    DocumentRoot "C:/vhosts/localhost7"
    ServerName localhost7
    
        SetHandler php7-script
    


extra/httpd-xampp.conf
※下のような行を削除またはコメントアウト
※テストでphp7系のものも書いてたらそれも除去

#LoadFile "C:/xampp/php/php5ts.dll"
#LoadFile "C:/xampp/php/libpq.dll"
#LoadModule php5_module "C:/xampp/php/php5apache2_4.dll"

#PHPINIDir "C:/xampp/php"

で、apache再起動して ブラウザからそれぞれのphpinfo()を確認!
やった!できてる!

8. php.iniを使い分ける

ここが今回の最ハマりポイントでした。

はまった原因は php本家の日本語マニュアルに抜けがあった という事です。
teratailさんに助けてもらいました。マジ感謝です。

マニュアルをざっくりした感じでまとめると
phpのバージョンごとにphp.iniの場所を指定できるよ!
Windows版ではレジストリで指定できるよ!
レジストリキーは
HKEY_LOCAL_MACHINE\SOFTWARE\PHP\[x[.y[.z]]]
で IniFilePath というエントリを作って、ディレクトリを指定してね
ただし、32bit版のapacheを64bit機で動かしてる場合は
HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\PHP\[x[.y[.z]]]
だからね!

という事でした。
ただし、以下の部分が日本語マニュアルには書いてなかったんです。マジで。
が、むこうからするとなんで64で32の動かすんだよ、プンプンって感じなのかもしれません。

まぁ、ともかくレジストリキーを設定です。
僕の場合は
HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\PHP\5.6
IniFilePath=C:\xampp\php
HKEY_LOCAL_MACHINE\Wow6432Node\SOFTWARE\PHP\7.2
IniFilePath=C:\xampp\php72
って感じでした。

そして念のためOSの再起動をしてから、phpinfo()で 読んでいるphp.iniの場所を確認します。
Loaded Configuration File って項目ですね。
ここが位と下通りになってればOK
僕の場合は
5系の場合
C:\xampp\php\php.ini
7.2の場合
C:\xampp\php72\php.ini

これで今日からPHP7使いにグレードアップしました!
5と比べて処理時間が半分になったという事なので、楽しみですね!

←よかったらクリックお願いします。

kataware の紹介

二児の父、職業SE、やりたいことはゲームと歌とアプリ作ったりサーバいじったり娘の服を作ったり色々あり過ぎて時間が足りなさ過ぎて病みそうだから娘に癒してもらってる。
カテゴリー: php, SE備忘録   パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です