かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP phpbrewで古い環境のPHPを動作させたメモ

別の人が作成した古いWordPressの改修の依頼が来て、環境つくりに時間がかかったのでメモをしておきます。
レンタルサーバーで動いているサイトだったのでPHP + Apache + MySQLという構成です。

要件

  • <?, <?= という書き方が多用されているのでエラーにならないようにする
  • php.ini など極力触りたくない (戻すの忘れそうで面倒なので)

<?<?=という書き方を今までしたことなかったので、戸惑いました。
検索してみた結果

PHP では、短い形式の開始タグ <? も使えます (しかしこれはおすすめしません。というのも、この形式のタグは php.ini で short_open_tag を有効にするか --enable-short-tags オプションつきで PHP を configure した場合でないと使えないからです)。

7.0.0 ASP タグ (<%, %>, <%=) や script タグ (<script language="php">) が PHP から削除されました。
5.4.0 short_open_tag の設定にかかわらず、<?= は常に使えるようになりました。
出典: PHP: PHP タグ - Manual

という事のようです。
5.4.0 short_open_tag の設定にかかわらず、<?= は常に使えるようになりました。」と書かれているのですが、
PHP7で<?=のあるファイルの表示を試したら設定が悪いのか、<?=がそのまま文字列として出力されてしまったので、PHP7以前に戻してshort_open_tagをONにすれば、この古(いにしえ)WordPressのテーマを動作させることができそうです。

phpbrewでPHP56に切替える

PHPはphpbrewでインストールしています。

インストールできるPHPのバージョンを確認

$ phpbrew known
7.3: 7.3.1, 7.3.0 ...
7.2: 7.2.14, 7.2.13, 7.2.12, 7.2.11, 7.2.10, 7.2.9, 7.2.8, 7.2.7 ...
7.1: 7.1.26, 7.1.25, 7.1.24, 7.1.23, 7.1.22, 7.1.21, 7.1.20, 7.1.19 ...
7.0: 7.0.33, 7.0.32, 7.0.31, 7.0.30, 7.0.29, 7.0.28, 7.0.27, 7.0.26 ...
5.6: 5.6.40, 5.6.39, 5.6.38, 5.6.37, 5.6.36, 5.6.35, 5.6.34, 5.6.33 ...
...

PHP5.6.40をインストール

$ phpbrew install 5.6.40 +default +mysql +apxs2 +openssl

Apache, MySQLを使うので+apxs2, +mysqlバリアントを合わせてインストールします。
+apxs2オプションを付けると自動的にhttpd.conflibphpをロードする設定が追加されます。

(ビルドに時間がかかる....

PHPのバージョンを切替える

ビルドが完了したら使用するPHPのバージョンを切替えます。

インストールされているPHPの確認

$ phpbrew list
* php-7.3.1
  php-5.6.40

PHPを切替える

$ phpbrew use php-5.6.40
$ php -v
PHP 5.6.40 (cli) 

php.iniの設定

非推奨のshort_open_tagphp.iniには設定せず、タイムゾーンmysql.sockだけ設定します

php.iniの場所を調べる

$ php --ini
Configuration File (php.ini) Path: /Users/user_name/.phpbrew/php/php-5.6.40/etc

php.iniを編集

タイムゾーン date.timezoneで検索

[Date]
; Defines the default timezone used by the date functions
; http://php.net/date.timezone
date.timezone = "Asia/Tokyo"

MySQL mysql.default_socketで検索

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/pdo_mysql.default-socket
pdo_mysql.default_socket= /usr/local/var/mysql/mysql.sock

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysql.default-socket
mysql.default_socket = /usr/local/var/mysql/mysql.sock

; Default socket name for local MySQL connects.  If empty, uses the built-in
; MySQL defaults.
; http://php.net/mysqli.default-socket
mysqli.default_socket = /usr/local/var/mysql/mysql.sock

pdo_mysql.default_socket, mysql.default_socket, mysqli.default_socket の3箇所に設定をしました。

Apache httpd.confの設定

PHPのモジュール(libphp)を先に入れていたPHP7をコメントアウトして、PHP5のものが使われるようにします

httpd.conf

# php7 Module
# 👇 コメントアウト
# LoadModule php7_module        libexec/libphp7.3.1.so

# php5 Module
LoadModule php5_module        libexec/libphp5.6.40.so

動作確認

ここまででapache上でPHPが動作しMySQLに接続できるか確認します。

Apacheを起動

$ sudo apachectl start

MySQLを起動

$ mysql.server start

localhostディレクトリ内に次のような確認用のPHPファイルを作成します。

<?php
// mysql 接続テスト
define('DB_DATABASE','test');
define('DB_USERNAME','root');
define('DB_PASSWORD','root');
define('PDO_DSN','mysql:host=localhost;dbname=' . DB_DATABASE);
try{
  $pdo = new PDO(PDO_DSN,DB_USERNAME,DB_PASSWORD);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $stmt = $pdo->query('SHOW TABLES');
  while($res = $stmt->fetch(PDO::FETCH_ASSOC)) {
    var_dump($res);
  }
  $pdo = null;
} catch(PDOException $e) {
  echo $e->getMessage();
}

// PHP情報を表示
phpinfo();

localhostからこのPHPファイルにアクセスして、データベースのテーブルとPHPのバージョンがPHP Version 5.6.40と表示されていればOKです。

<? を許容する設定

問題になっているサイトのディレクトリのルートに.htaccessを作成しshort_open_tagを許可する設定を追加します。

php_flag short_open_tag on

 
これで問題になっていた<?, <?=が多用されていたWordPressのテーマをローカルで表示できるようになりました!

PHPのバージョンを7系に戻す場合は

  1. apache, mysqlを停止
  2. phpbrewで使用するバージョンを7に変更 phpbrew use php-7.3.1
  3. httpd.confphp7_moduleコメントアウトを外し、php5_moduleコメントアウト
  4. apache, mysqlを起動

の手順で戻すことができます。

使用するバージョンを切替える度に都度httpd.conf内のモジュール部分を変更しないといけないのが少しメンドクサイのですが、phpbrewを使えば比較的楽にPHPのバージョンを切替えて使うことができそうです。


[参考]