TOP ▲ itcore TOPTIPSphp5.4.php  タグ:php 移行 非互換

PHP5.3からPHP5.4への移行 | itcore 2019年

概要

PHP5.4では「下位互換性のない変更点」が多くあります。
アプリケーションを出来るだけ変更せずに移植する方法探します。

.htaccess サンプル

参考 php.ini ディレクティブのリスト

[.htaccess]
<Files ~ "^\.(htaccess|htpasswd)$">
deny from all
</Files>
AuthUserFile /var/www/erp2.itcore.jp/.htpasswd
AuthGroupFile /dev/null
AuthName "Please enter your ID and password"
AuthType Basic
require valid-user
order deny,allow

php_flag display_errors On
php_value error_reporting 32767
php_flag short_open_tag On
php_value date.timezone "Asia/Tokyo"
php_value output_handler mb_output_handler
php_flag mbstring.encoding_translation On
php_value mbstring.detect_order auto
php_value mbstring.func_overload 1
php_value mbstring.http_input auto
php_value mbstring.http_output UTF-8
php_value mbstring.internal_encoding UTF-8
php_value mbstring.language Japanese
php_value session.save_path /var/www/erp2.itcore.jp/tmp_session
php_value session.gc_maxlifetime 0
php_value session.gc_probability 1
php_value session.gc_divisor 30000
php_value upload_max_filesize 10M

RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

関数の引数参照渡し

「Call-time pass-by-reference has been removed」というエラーがでたら、引数の&を削除する。
func(&$var) -> func($var)

register_globals対策

register_globalsディレクティブはPHP5.4.0でサポートされなくなりました。 PHPドキュメント

暗黙的に宣言されたフォーム変数を使っているアプリケーションは、
フォーム変数を明示的に受け取る処理をソースに追加する必要があります。
$var = uForm("var");

ただ、ほとんどすべてのプログラムの修正とテストをする必要があり、
大きなアプリケーションでは多大な苦労を伴います。

以下のコードによって、渡されているフォーム変数を調べることができます。
global $debug;
if ($debug) {
  echo "[debugxxx _POST start] ";
  foreach($_POST as $var=>$value) {
    echo "var=$var value=$value ";
  }
  echo "[debugxxx _POST end]";
  echo "[debugxxx _GET start] ";
  foreach($_GET as $var=>$value) {
    echo "var=$var value=$value ";
  }
  echo "[debugxxx _GET end]";
}

eval関数を使ってフォーム変数からローカル変数を生成するという方法も考えられます。


もしアプリケーションが社内利用などセキュリティがある程度限定されている場合は、
CentOS6.x + PHP5.3.xを利用するという選択肢もあります。
その場合は外部からの攻撃を避けるために、BASIC認証をかける、アクセス元のIP制限をかける、
などの対策を行います。