PHP5.3開発情報

木谷 公哉(KITANI Kimiya) kitani@bakkers.gr.jp

1. PHP5.3へアップグレードしたら、sqliteが使えなくなった 2010.11.08
PHP5からサポートされたsqlite3のみ対応します。
PDOを利用しているのでPDOが入っていないのかと
pecl install pdo
pecl install pdo [pdo_dbh.lo] Error 1
とすると、エラーで止まる。
実は、PHP5.3からPDOが内包されたので、インストールの必要がなくなっているのです。
phpinfo()でsqlite3がサポートされているという記述がでてきたら、使えます。
2. PHP5.3へアップグレードしたら、Wordpress 3.0.1で設定(options-general.php)にアクセスできなくなった 2010.11.16

2011.07.12: 解決しました!!

pecl upgrade timezonedb
とtimezonedbを念のためアップグレードした上で、 php.iniあるいは、/etc/php.d/timezone.ini(デフォルト設定)などに、
extension=timezonedb.so
を入れて、
php -r 'timezone_identifiers_list();' 
でSegmentation Faultが出ないことを確認の上、Apacheを再起動すればいい!!

結論から先にいうと、Olson Time zone databaseを使っているため、PHP5.3で新たに加わった関数(timezone_identifiers_list)を呼ぶと深刻なエラーになってしまうことです。
この現状になるケースは、yumなどでphpをupdateするときに、--with-system-tzdataの特殊オプションをつけてコンパイルされている場合です。

判別方法としては、
(例)php -r 'var_dump ( timezone_identifiers_list() );'
を実行して
「Segmentation fault (core dumped)」
が出たらこの問題になっているということです。
ちなみにそのときのログ(/var/log/messages)は、
php[31640]: segfault at 0000000000000004 rip 000000000042245c rsp 00007fffd2057380 error 4
のようにでます。

ソースからコンパイルすることでうまくいきますが、yumなどで管理していてそれが難しいのなら、暫定回避方法としては、

  wp-includes/function.php
「function wp_timezone_supported()」内の
$support = true; を $support = false;に書き換えることです。
これは、Wordpressの本体バージョンアップ時ごとにする必要があります
[関連リンク]
2010.11.16作成, 2010.11.18加筆訂正, 2010.11.19加筆, 2011.07.12加筆
3. sqlite_escape_stringがないと言われるんだけど? 2011.02.18
結論からいうと、--without-sqliteオプションを付けてコンパイルされたものは、そのようなエラーがでます。utterramblings.repoリポジトリを使って、PHP5最新版をyum update phpで使っている人は確実に該当します。
php -r 'print sqlite_escape_string("a");'
とコマンドラインから実行して
PHP Fatal error:  Call to undefined function sqlite_escape_string() in 
というエラーが出てきたら、sqliteが入っていません。
このような場合、自前でsqlite_escape_stringを作るということもできます。あるいはsqliteを後でソースからインストールすることも可能です。後者のケースでは、yum updateとセットで実行する必要があるでしょう。

方法1)sqliteをソースから入れる

あなたがサーバ管理者ならこれが混乱なく対応できる最善の方法でしょう。
ただしこの方法は、yum updateしてphpのバージョンがあがる時にセットで実行が必要です
  1. php.netから、yum updateで更新したのと同じバージョンのphpソースをダウンロードします。
  2. ソースを展開(解凍)します
  3. 下記のコマンドを実行します。
    cd 展開フォルダ/ext/sqlite
    phpize
    make
    make install
    
  4. /etc/php.d/sqlite.iniという名前のファイルを作成し「extension=sqlite.so」と一行入力し保存します。
  5. apacheを再起動します(apachectl graceful)
  6. php -i | grep -i sqlite あたりのコマンドで、「SQLite support => enabled」が出ていたらOK
  7. php -r 'print sqlite_escape_string("a");' でエラーが出ないことを確認

ext/sqliteは2.xなんですかねぇ。ext/sqlite3の方がいいのかもしれない・・(次のバージョンで試してみよう。基本的にsqlite使うときにはpdo_sqliteつかうんで、sqlite_escape_stringさえ使えればどっちでもいいんですけどね。
方法2)自前でsqlite_escape_string関数を作る

[対応方法]: PHP5.3以上を使っていてsqlite_escape_string関数がなければ追加する

下記をconfig.php等、sqlite_escape_string関数を呼び出す前に宣言しましょう。
 if (version_compare(PHP_VERSION,"5.3.0",">")){
   if(!function_exists('sqlite_escape_string')){
     function sqlite_escape_string($src, $db_name=""){
        if(defined('SQLITE_DATA_PATH'))
          $db_name = SQLITE_DATA_PATH;
        if(empty($db_name) || empty($src)) return false;

        $db = new SQLite3($db_name);
        $tmp = $db->escapeString($src);
        $db->close();
        return $tmp;
     }
   }
 }
 
そして、データベースファイルの絶対パスを「SQLITE_DATA_PATH」で定義するか、第2引数に入れましょう。
a. [定義する方法](PHP5.2などで利用していた従来関数を触らずに済ます方法)
- define('SQLITE_DATA_PATH', 'aaaaaa.db');
- $escape_string = sqlite_escape_string($string);

b. [引数として入れる方法]
- $escape_string = sqlite_escape_string($string, 'aaaaaa.db');
PHP5.3でのSQL文のエスケープは、SQLite3クラスのescapeStringメソッドで処理できるようになりました。その替わりか、sqlite_escape_stringが消えてます(バグかもしれませんが)。後方互換がいきなり消えるのはいただけませんし、単なるバグならそのうち復活するかもしれません。復活してもOKなように、コードを組んでます。
4. Wordpressの問い合わせフォームが動かない! 2011.02.22
これ結構はまりそうなので情報として載せておきます。
特にソースからコンパイルしているときはオプションによって影響をうけなさそうですが、yumなどパッケージからインストールしているときは、はまるかもしれません。
今回はyum update phpで、php5.3.3 --> 5.3.5にしたことでエラーがでてきました。
以下、yum を使って管理していると仮定します。
■ 参考URL
■ Apacheのサーバエラーログ
[Tue Feb 22 17:16:25 2011] [error] [client 接続クライアントIP] PHP Warning:
 preg_replace(
) [function.preg-replace]:
Compilation failed: unknown option bit(s) set at offset 0 in
/wordpress設定の絶対パス/wp-includes/shortcodes.php on line 228, referer:
http://WordprssのURL/?page_id=??