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

PHPのバージョンは、思いのほか頻繁に上がります。
ただ上がるだけならばよいのですが、バージョン8になってからは古い仕様が動作しなくなってきています。
つまり、PHPバージョンを上げたとたん、エラーで表示されなくなるなどの不具合が発生します。
問題の個所を修正できれば良いのですが、丸ごと差し替えなど少々時間がかかる場合は考え物です。
なぜならば、しばらくの間PHPのバージョンを上げられないからです。
そこでこう考えました。
古いバージョンで動作させたい部分だけ、古いバージョンで動かせないだろうか?
やり方をググって調べてみたところ、特定フォルダだけPHPのバージョンを変えるやり方がありました。
このやり方をすれば、最新のPHPバージョンにあげても、不具合の出る部分はそのまま使用できます。
忘備録として記録いたします。
特定フォルダだけPHPのバージョンを変更する方法

さくらサーバーで、特定フォルダのPHPバージョンを変更するには、以下のファイルを用意します。
- .htaccess
- php.cgi
それぞれのファイルには、次のように記述します。
.htaccessの記述内容
1 2 | 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に設定します。
1 2 | #!/bin/sh exec /usr/local/php/8.3/bin/php-cgi |
これは、このままコピーペーストでOKです。
ちなみにPHP7.4の場合は以下のように記述します。
1 2 | #!/bin/sh exec /usr/local/php/7.4/bin/php-cgi |
PHP5.6の場合は以下のように記述します。
1 2 | #!/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を指定したいです。
そんなことがさくらサーバーでできるのか?
と思っていたら、以下のようにすればできました。
- .user.iniファイルにdefault_charsetを記述して、.htaccessと同じ位置に設置する
特定フォルダに、php.iniを設置する場合は、.user.iniに記述して設置するだけでした。
ちなみに、.user.iniのuserの前の「.」は必須のようです。
以下の内容を記述して、設置したところ、文字化けが直りました。
1 | default_charset="Shift_JIS" |
疑問がわいたので、ついでにいろいろ試してみました

特定フォルダに.htaccessとphp.cgiを設置すればPHPのバージョンを変更できることがわかりました。
ここで疑問がわきました。
1)ドメイン指定フォルダより上層位置に.htaccessとphp.cgiを設置
.htaccessの記述
1 2 | Action myphp-script ../php.cgi AddHandler myphp-script .php .html |

さくらサーバーでは、下層フォルダにドメインを割り当てることができます。
ならば、ドメインを割り当てしたフォルダより上位に設置したら、動作するのか試してみました。
結果は、うまく動作しませんでした。
.htaccessのパスを「../」と指定してみましたが駄目でした。
php.cgiは、ドメイン割り当てフォルダ以下でないと動作しないようでした。
2)php.cgiをドメイン割り当てフォルダに設置
php.cgiをドメイン割り当てフォルダより上層に設置した場合、うまく動作しなかったため、ドメイン割り当てフォルダと同じ位置に設置いたしました。
この場合は、ドメイン割り当てフォルダ以下全体に、指定したPHPのバージョンが反映されました。
.htaccessの記述
1 2 | Action myphp-script /php.cgi AddHandler myphp-script .php .html |

3).htaccessは上層、php.cgiは下層に設置
こんな設置方法はあまりないかもしれませんが、ドメイン割り当てフォルダの上層に.htaccess、ドメイン割り当てフォルダの下層にphp.cgiを設置してみました。
やってみると、ドメイン割り当てフォルダ以下全体に指定したPHPのバージョンが反映されました。
結局.htaccessで指定したフォルダ以下に反映されるようです。
.htaccessの記述
1 2 | Action myphp-script /「下層フォルダ名」/php.cgi AddHandler myphp-script .php .html |

4)ドメイン割り当てフォルダの下層に.htaccessとphp.cgiを設置
今度は、ドメイン割り当てフォルダの下層フォルダに.htaccessとphp.cgiを設置してみました。
すると、下層フォルダのみ指定PHPのバージョンが反映され、他のフォルダはデフォルトバージョンとなりました。
.htaccessの記述
1 2 | Action myphp-script /「下層フォルダ名」/php.cgi AddHandler myphp-script .php .html |

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

今回は、さくらサーバーで特定フォルダだけPHPのバージョンを変える方法について調べました。
他のサーバーでは.htaccessだけで設定できたりしますが、さくらサーバーでは、cgiファイルが必要でした。
ただ、あくまでもCGI版のPHP指定となるため、モジュール版のPHPを使用するにはデフォルト指定しかありません。
ですので、PHPのバージョンを上げることで発生するエラー回避目的など、一時的な処置としての方法になるかと思います。
PHPプログラム自体を最新のバージョンで動作するように直すことが、最も良い対応方法なのです。