PHP 4.2.1 で正規表現を使ったとき、以下のエラーを出して apache が落ちる。
正規表現で全角スペースを含む文字列を trim する際にこの問題が出た。
結局、長くなるおそれのある文字列は標準の trim() のみ行う、ということにした。
正規表現で置換するとき、検索対象となる文字列があまりに長い場合にこの現象が起きるようだ。以下、問題を再現できるコード。長いけど。
$ tail -f /var/log/httpd/error_log
[Tue Dec 3 20:58:50 2002] [notice] child pid 6053 exit signal Segmentation fault (11)
正規表現で全角スペースを含む文字列を trim する際にこの問題が出た。
結局、長くなるおそれのある文字列は標準の trim() のみ行う、ということにした。
正規表現で置換するとき、検索対象となる文字列があまりに長い場合にこの現象が起きるようだ。以下、問題を再現できるコード。長いけど。
<?php
$base_str = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">';
$Zspace = '(?:\xA1\xA1)'; // 全角スペース
$ascii = '[\x00-\x7F]'; # 1バイト EUC-JP文字
$twoBytes = '(?:[\x8E\xA1-\xFE][\xA1-\xFE])'; # 2バイト EUC-JP文字
$threeBytes = '(?:\x8F[\xA1-\xFE][\xA1-\xFE])'; # 3バイト EUC-JP文字
$character = "(?:$ascii|$twoBytes|$threeBytes)"; # EUC-JP文字
$count = 1000;
$str = '';
for ($i = 0; $i < $count; $i++) {
$str .= $base_str;
}
// $str が EUC-JP の場合
$str = preg_replace("/^($character*?)(?:\s|$Zspace)+$/", "$1", $str);
print htmlspecialchars($str);
?>
[PHP-users 11299] に従い、sonic でテストしてみる。
knowhow や pro でテストするならば、
knowhow や pro でテストするならば、
./configure --with-pgsql --enable-track-vars --with-apxs=/usr/local/apache/bin/apxs --enable-versioning --without-gd --enable-trans-sid --enable-mbstring --enable-mbregex --enable-mbstr-enc-trans && time nice -19 make testというオプションになるが、sonic の apache は OS のデフォルトのままなので、
./configure --with-pgsql --enable-track-vars --with-apxs=/usr/sbin/apxs --enable-versioning --without-gd --enable-trans-sid --enable-mbstring --enable-mbregex --enable-mbstr-enc-trans && time nice -19 make testとなる。