読者です 読者をやめる 読者になる 読者になる

エロサイトの作り方

2013年11月から勉強しながらエロサイトを作っています。

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_tagphp.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 !

https://dev.sourcefabric.org/browse/CC-5354

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する。

Ubuntu 12.04のPHPを最新にする - エロサイトの作り方

こういう手抜きをするとハマる、ということでしょうかね。

みなさんも気をつけましょう。