web関連

さくらインターネットで違うバージョンのphpを使う方法

さくらインターネットで違うバージョンのphpを使う方法

さくらインターネットを使用しているお客さんのサイトのリニューアルをすることになったのだが、既存サイトがwordpressやらphpやらゴミゴミしていてPHP5.2からあげるのが億劫だったので特定のディレクトリのみPHPのバージョンをあげました。

必要なファイル

  • php.cgi
  • .htaccess

さくらインターネットではこの2つのファイルが必要になります

php.cgi

下記コードを記述したファイルを作成します

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

さくらが用意していれば数字(7.1)の部分を変えるだけで任意のPHPを利用できる

パーミッションは705(←重要)に設定します
何も設定していないと「604」になっていると思いますが、パーミッションを変更しておかないと「Internal Server Error」出るので気をつけます。

ローカルで新規作成するときは文字コードとかバイナリモードで転送とか気を使うので僕はサーバー上で複製して名前変えて該当箇所に移動させたりする

.htaccess

「.htaccess」も同じく下記コードを記述したファイルを作成する

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

このとき/php.cgiのファイルパスは注意
ルート直下に××××ディレクトリを作っていてそのデイレクトリのPHPのバージョンを変える場合はパスが/××××/php.cgiとなる
/php.cgiだけだとルートディレクトリ(一番上の階層)を見に行ってしまう(1敗)

404エラー(not found)が出た場合

~was not found on this server.という「404エラー(not found)」画面が表示された場合は、サーバコントロールパネルにアクセスして頂き「アクセスログの設定」→「エラーログ」をクリックしてエラーを確認してみると早いです。

実際にあったエラー

script not found or unable to stat

僕はこのようなエラーが発生していて調べてみたら
「ファイルが見つからないよー」というエラーみたいで、よくよく見てみたら.htaccessのところのAction myphp-script /php.cgiのファイルパスが違いました…(例の1敗)

// ルートディレクトリ直下にディレクトリ「phptest」を立ててた
Action myphp-script /phptest/php.cgi
AddHandler myphp-script .php .html

先頭の「/(スラッシュ)」はルートを指すんすね…
てっきり現在いるディレクトリを指すものとご認識してました

反省…

追記:500エラー(Internal Server Error)が出た場合

この記事作った後に、さくらのデモ環境で別バージョンのphpを使おうとしたらやらかした。
戒めに追記しておきます。

実際にあったエラー

The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator at support@sakura.ad.jp to inform them of the time this error occurred, and the actions you performed just before this error.
More information about this error may be available in the server error log.

日本語訳:サーバーで内部エラーまたは構成ミスが発生し、要求を完了できませんでした。

php.cgiのパーミッションを604→705にしたら見れるようになりました。

終わりに

さくらインターネットは有名どころだから、異なるPHPのバージョンを使う方法としてはたくさんあったけど、何も考えず記事通りやるとどつぼにはまるんだなと思い戒めに記事として作成しました。

いまだに絶対パスと相対パスってどっちがどっちだっけ?と都度調べているレベルなので勉強せねば

今回異なるバージョンのphpを使う事になったサイトさん、wordpressが約20サイト+多数のphpファイルが群雄割拠していてこれはサーバーのPHPのバージョンはあげられないわという結論にいたり特定のディレクトリのみバージョンをあげました