PHP5.6 が EOL(5)
PHP7への移行準備が完了
php7cc を使用して修正が必要な箇所を調べたところ、当初の見込みどおりMySQL拡張(mysql関数)と、ereg(), eregi()関数が検出されただけだった。また、短縮形式タグ "<? ?>"については php7cc は検出してくれないようだ。
MySQL拡張(mysql関数)については使用されている箇所が多いため、いちいち手作業で修正していたのでは大変だ。そのため、以下のような方法で機械的に一気に変更してみた。
$ find . -type f | xargs grep -l 'mysql_query(' | xargs sed -i -e 's/mysql_query(/mysqli_query(\$active_db,/g'
$ find . -type f | xargs grep -l 'mysql_' | xargs sed -i -e 's/mysql_/mysqli_/g'
$ find . -type f | xargs grep -l 'MYSQL_ASSOC' | xargs sed -i -e 's/MYSQL_ASSOC/MYSQLI_ASSOC/g'
mysql_connect()についてはmysqli_connect()に修正済みなので、それ以外のmysql関数をmysqli関数に変更した。面倒なのは、mysql関数から引数が追加されている点で、mysqli関数では基本的に第一引数にmysqli_connect()が返却したリンクIDを指定しなければならない。ただ、全てのmysqli関数がこうなっている訳ではなく、リンクIDが省略可能だったり、不要なものもある。
このBlogのソースについてざっと調べた限りでは、第一引数にリンクIDが必須なのは mysqli_query()関数(クエリ実行)だけのようだった。それ以外は省略可能、またはリンクID不要なので mysql_ を機械的に mysqli_ に書き換えれば良さそうだ。
ereg(), eregi()関数についてはもう少し面倒で、
ereg('パターン', 入力文字列) | → | preg_match('/パターン/', 入力文字列) |
eregi('パターン', 入力文字列) | → | preg_match('/パターン/i', 入力文字列) |
という修正を加えなければならない。やっかいなのがパターンの中に「/」を含んでいる場合で、このときは「/」の前に「\」を入れてエスケープするか、preg_match()でパターンの前後に付ける「/」(デリミタと言う)をパターンには現われない他の文字(例えば「#」などが良く使われる)に変更する必要があることだ。パターンが文字列リテラルで書いてあるなら話は簡単なんだが、パターンが文字列変数になっていると難しくなる。パターンに絶対に含まれない文字を特定するにはプログラムの内容を読み解く必要があるからだ。
今回はそこまでやってられないので、パターンが変数だった場合は "/".$pattern."/" という具合に、取り合えず前後に「/」を付けてしまい、実際に動作させたときにおかしな挙動をしたら調べることにした。
短縮形式タグ "<? ?>" は地味にやっかいなヤツで、PHP7では(デフォルトでは)使えなくなっているので、PHP5 では問題ないのに PHP7にしたとたんに正常に動作しなくなる(実は、これで結構ハマった)。使用されている箇所を
$ find . -name \*.php -exec grep -H '<? ' {} \;
で調べてみたところ数行程度だったので、これは一箇所ずつ手作業で "<?php ?>" に修正した。
これで暫くPHP5のまま動かしてみて、動作に問題なければ PHP7へ移行する準備が整ったことになる。
|