ホームページ制作 オフィスオバタ

さくらサーバーで特定フォルダだけPHPバージョンを変更する

PHPのバージョンは、思いのほか頻繁に上がります。
ただ上がるだけならばよいのですが、バージョン8になってからは古い仕様が動作しなくなってきています。

つまり、PHPバージョンを上げたとたん、エラーで表示されなくなるなどの不具合が発生します。

問題の個所を修正できれば良いのですが、丸ごと差し替えなど少々時間がかかる場合は考え物です。
なぜならば、しばらくの間PHPのバージョンを上げられないからです。

そこでこう考えました。

古いバージョンで動作させたい部分だけ、古いバージョンで動かせないだろうか?

やり方をググって調べてみたところ、特定フォルダだけPHPのバージョンを変えるやり方がありました。
このやり方をすれば、最新のPHPバージョンにあげても、不具合の出る部分はそのまま使用できます。
忘備録として記録いたします。

特定フォルダだけPHPのバージョンを変更する方法

さくらサーバーで、特定フォルダのPHPバージョンを変更するには、以下のファイルを用意します。

それぞれのファイルには、次のように記述します。

.htaccessの記述内容

Action myphp-script  /php.cgi
AddHandler myphp-script  .php  .html

この2行を付け足すだけです。
注意事項として、php.cgiのパス指定があります。

/php.cgi のパスは、ドメインから見て設置したパスを指定します。
具体的には、office-obata.com/php.cgi に設置し場合は「/php.cgi」
office-obata.com/test/php.cgiに設置した場合は「/test/php.cgi」と記述します。

私は最初、/home/ユーザー名/www/ というようなパスを指定し、まったく動作しませんでした。

ちなみに、有効範囲は.htaccessを設置したフォルダ以下が対象になりました。
php.cgiの位置はあまり関係ありませんでした。
※ただし、ドメインから見えない位置(ドメインより上階層)にphp.cgiを設置した場合はうまく動作しませんでした。

php.cgiの記述内容

php.cgiファイルを作成し、以下の内容を記述して設置します。
設置時にパーミッションを705に設定します。

#!/bin/sh
exec  /usr/local/php/8.3/bin/php-cgi

これは、このままコピーペーストでOKです。
ちなみにPHP7.4の場合は以下のように記述します。

#!/bin/sh
exec  /usr/local/php/7.4/bin/php-cgi

PHP5.6の場合は以下のように記述します。

#!/bin/sh
exec  /usr/local/php/5.6/bin/php-cgi

中の数値を該当のバージョンにすればOKです。
さくらサーバーは、CGI版のPHPもあるため、それを利用する方法のようです。

早速やってみたら文字化けしました。

試しにテストでやってみたところ、設置したフォルダ以下が文字化けしました。
正確にはShift-JISで記述していたHTMLが強制的にUTF-8で表示しようとしていました。

原因を調べたところ、default_charsetがUTF-8に変わっていました。
これを何とかするには、default_charsetをShift-JISに戻せばよいのですが、下層フォルダのためphp.iniが使えません。(正確にはさくらサーバーでは、最上位位置でしかphp.iniが指定できません。)

他の影響も考えると、.htaccessを設置したフォルダ以下だけdefault_charsetを指定したいです。

そんなことがさくらサーバーでできるのか?
と思っていたら、以下のようにすればできました。

特定フォルダに、php.iniを設置する場合は、.user.iniに記述して設置するだけでした。
ちなみに、.user.iniのuserの前の「.」は必須のようです。

以下の内容を記述して、設置したところ、文字化けが直りました。

default_charset = "Shift_JIS"

疑問がわいたので、ついでにいろいろ試してみました

特定フォルダに.htaccessとphp.cgiを設置すればPHPのバージョンを変更できることがわかりました。
ここで疑問がわきました。

1)ドメイン指定フォルダより上層位置に.htaccessとphp.cgiを設置

.htaccessの記述

Action myphp-script  ../php.cgi
AddHandler myphp-script  .php  .html

さくらサーバーでは、下層フォルダにドメインを割り当てることができます。
ならば、ドメインを割り当てしたフォルダより上位に設置したら、動作するのか試してみました。

結果は、うまく動作しませんでした。
.htaccessのパスを「../」と指定してみましたが駄目でした。
php.cgiは、ドメイン割り当てフォルダ以下でないと動作しないようでした。

2)php.cgiをドメイン割り当てフォルダに設置

php.cgiをドメイン割り当てフォルダより上層に設置した場合、うまく動作しなかったため、ドメイン割り当てフォルダと同じ位置に設置いたしました。

この場合は、ドメイン割り当てフォルダ以下全体に、指定したPHPのバージョンが反映されました。

.htaccessの記述

Action myphp-script  /php.cgi
AddHandler myphp-script  .php  .html

3).htaccessは上層、php.cgiは下層に設置

こんな設置方法はあまりないかもしれませんが、ドメイン割り当てフォルダの上層に.htaccess、ドメイン割り当てフォルダの下層にphp.cgiを設置してみました。

やってみると、ドメイン割り当てフォルダ以下全体に指定したPHPのバージョンが反映されました。
結局.htaccessで指定したフォルダ以下に反映されるようです。

.htaccessの記述

Action myphp-script  /「下層フォルダ名」/php.cgi
AddHandler myphp-script  .php  .html

4)ドメイン割り当てフォルダの下層に.htaccessとphp.cgiを設置

今度は、ドメイン割り当てフォルダの下層フォルダに.htaccessとphp.cgiを設置してみました。
すると、下層フォルダのみ指定PHPのバージョンが反映され、他のフォルダはデフォルトバージョンとなりました。

.htaccessの記述

Action myphp-script  /「下層フォルダ名」/php.cgi
AddHandler myphp-script  .php  .html

特定フォルダだけPHPのバージョンを変えるのは、あくまでも一時処置

今回は、さくらサーバーで特定フォルダだけPHPのバージョンを変える方法について調べました。
他のサーバーでは.htaccessだけで設定できたりしますが、さくらサーバーでは、cgiファイルが必要でした。

ただ、あくまでもCGI版のPHP指定となるため、モジュール版のPHPを使用するにはデフォルト指定しかありません。

ですので、PHPのバージョンを上げることで発生するエラー回避目的など、一時的な処置としての方法になるかと思います。

PHPプログラム自体を最新のバージョンで動作するように直すことが、最も良い対応方法なのです。

モバイルバージョンを終了