Archive: 2010/06/22

原因はPCREの設定

rNotePHP5対応。先日のトライでpreg_matchがカギを握っているところまで追い詰めたのだが、しつこくググったところpreg系関数 100Kを越える大きさの文字列を処理できないという話に辿り着いた。

PHP 5.2.0で追加された設定だそうだが、pregがPCREに繋がるとは思わなかったなぁ。

早速/etc/php5/apache2/php.iniを修正してPCREの上限を256KBに拡張したところ、rNoteの再構築できるようになった。

でも、こないだ弄った[[:space:]]を元通りに戻して

function get_XMLTag($tag,&$str){
if(preg_match("/<$tag.*?>[[:space:]]*(.*)[[:space:]]*<\/$tag>/s",$str,$buf)) {
return $buf[1];
}
return '';
}
試したみたところ194KBの記事だけNGだった。もしかして、と思って上限を512KBまで上げたら改善されたので、\sより[[:space:]]の方が無駄にメモリを喰うという事のようだ。

あじさい(IMG_0107.JPG)
6/21 15:10 筥崎宮、あじさい苑にて

というわけで、/etc/php5/apache2/php.ini

[Pcre]
;PCRE library backtracking limit.
;pcre.backtrack_limit=100000
pcre.backtrack_limit=512000

;PCRE library recursion limit.
;Please note that if you set this value to a high number you may consume all
;the available process stack and eventually crash PHP (due to reaching the
;stack size limit imposed by the Operating System).
;pcre.recursion_limit=100000
pcre.recursion_limit=512000
と修正する事で、最終決着。

/etc/php5/apache2/php.iniを修正した後は、

$ sudo /etc/init.d/apache2 restart
するのも忘れずに。