PHP5.5でWordPressがエラーをだしていた件(解決)
この記事内で起きていたPHP 5.5でエラーが起きてた件、
[Mon Dec 30 16:09:43.037018 2013] [:error] [pid 8572] [client ...:51733] PHP Parse error: syntax error, unexpected 'add_action' (T_STRING), expecting function (T_FUNCTION) in /var/www/wp-content/themes/mytheme/functions.php on line 113, referer: http://wordpress.local/wp-admin/widgets.php
書いた事も忘れてたけど、Ubuntu 14.04にアップデートした時に同じ問題が起きてググったら自分のブログがヒットしたという……
今回は解決させました。
エラーの発生原因
add_action('widgets_init', create_function('', 'return register_widget("SidePanelItem");'));
エラーになっていたSidePanelItem
で以下の記述がありまして、
class SidePanelItem extends WP_Widget {
...
function widget($args, $instance) {
extract( $args );
$title = apply_filters( 'widget_title', $instance['title'] );
$text = apply_filters( 'widget_text', $instance['text'] );
$class = apply_filters( 'widget_class', $instance['class'] );
?>
<section class="panel p-sidemenu-panel <?php echo $class; ?>">
<?php if ($title) { ?>
<div class="panel-heading"><h3><?php echo $title; ?></h3></div>
<? } ?>
<div class="panel-body">
<?php echo $text; ?>
</div>
</section>
<?php
}
...
}
どこがまずかったかというと、
<? } ?>
ここ。typoだったのですが、タグが<?php ?>
になっていない。
これはshort_open_tag
と呼ばれる記法みたいです。
なぜバージョンを上げたらエラーになったのか
short_open_tag
はphp.ini
で有効/無効の制御ができるのですが、どうもアップデート時にデフォルト値が変わったからのようです。
PHP 5.4.x
$ php -r 'phpinfo();' | grep short_open_tag
short_open_tag => On => On
PHP 5.5.x
$ php -r 'phpinfo();' | grep short_open_tag
short_open_tag => Off => Off
しかも、公式の移行ガイドに記載が無い情報なんですよね。
なかなかひどい。
いつ変更されたのか?
これもいまいち分からないのですが、今配布されている公式版は5.3/5.4/5.5系のどれも無効にされていますね。
PHP 5.3.29
$ grep -r short_open_tag php-5.3.29 | grep php.ini
php-5.3.29/php.ini-development:; short_open_tag
php-5.3.29/php.ini-development:short_open_tag = Off
php-5.3.29/php.ini-production:; short_open_tag
php-5.3.29/php.ini-production:short_open_tag = Off
PHP 5.4.32
$ grep -r short_open_tag php-5.4.32 | grep php.ini
php-5.4.32/php.ini-development:; short_open_tag
php-5.4.32/php.ini-development:short_open_tag = Off
php-5.4.32/php.ini-production:; short_open_tag
php-5.4.32/php.ini-production:short_open_tag = Off
PHP 5.5.16
$ grep -r short_open_tag php-5.5.16 | grep php.ini
php-5.5.16/php.ini-development:; short_open_tag
php-5.5.16/php.ini-development:short_open_tag = Off
php-5.5.16/php.ini-production:; short_open_tag
php-5.5.16/php.ini-production:short_open_tag = Off
Ubuntu版に関しては、13.10で変更されたという情報がありました。
short_open_tag defaults to off on Ubuntu 13.10 !
13.10はPHP 5.5.3が入っているらしいので、5.5以降でデフォルト値が変わったようです。
手持ちの環境で確認してみても5.5から変わっています。
PHP 5.4.32(Ubuntu 12.04、5.3からアップデート)
$ php -v
PHP 5.4.32-2+deb.sury.org~precise+1 (cli) (built: Aug 25 2014 11:00:57)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
$ grep -r short_open_tag /etc/php5
/etc/php5/cli/php.ini:; short_open_tag
/etc/php5/cli/php.ini:short_open_tag = On
/etc/php5/fpm/php.ini:; short_open_tag
/etc/php5/fpm/php.ini:short_open_tag = On
PHP 5.5.9(Ubuntu 14.04)
$ php -v
PHP 5.5.9-1ubuntu4.4 (cli) (built: Sep 4 2014 06:56:34)
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
$ grep -r short_open_tag /etc/php5
/etc/php5/cli/php.ini:; short_open_tag
/etc/php5/cli/php.ini:short_open_tag = Off
/etc/php5/fpm/php.ini:; short_open_tag
/etc/php5/fpm/php.ini:short_open_tag = Off
回避策
今回の件に限ればshort_open_tag
を使わない、php.ini
を書き換える、という対策なのですが、根本的には
途中、php.iniを上書きしていいか?というダイアログが出てきたので、大して書き換えてないのでOKする。
こういう手抜きをするとハマる、ということでしょうかね。
みなさんも気をつけましょう。