ページ数が増えると、AutoLink の正規表現が原因で、make_link()が正常に動作しなくなり、空白を返します。
結果的にページが正常に表示されなくなります。
ページ数は5400ページほど、autolink.datのサイズが 38KB ほどで、この問題が出ています。
原因は解りませんが、正規表現パターンが大きすぎるのが原因かもしれません。
PHP: パターン構文 - Manual(http://www.php.net/manual/ja/reference.pcre.pattern.syntax.php)の以下の記述は関係あるのかな?
再帰的パターン
一つのパターン中に 15 以上のキャプチャ用サブパターンを用いると、PCRE は 再帰を行っている間のデータ保存用に追加の記憶領域を確保する必要が あります。
記憶領域が確保できない場合、メモリ不足エラーを再帰の内側から 出力する手段がないため、最初の 15 個のキャプチャ用サブパターンに ついてのみデータが保存されます。
データベース的な使い方をしようと思い、スクリプトを使ってページを 10000 件ほど追加したところ、 デフォルト表示の部分とプラグインの部分をのぞいてページが表示されない状態になりました。
cache/autolink.dat を削除するとページ編集時に一時的に見えるようになったので、
autolink 周りが怪しいと思いました。
関連しそうな pukiwiki.ini.php の設定項目は:
$autolink = 8;
ちなみに、 cache/autolink.dat のサイズは、 45KB 程度です。
$autolink = 0;
とすると、正常に表示されるようになりました。
CVS版 (ただし、 iconv で UTF-8 に変換済み) でも修正されていないことを確認しました。 BugTrack2/44 と重複しているかとも思ったのですが、違うかもです。 -- asari 2005-09-07 (水) 04:44:47
(?:BracketName|F(?:ormattingRules|rontPage)|InterWiki(?:Name|SandBox)? |MenuBar|PukiWiki|RecentChanges|SandBox|Wiki(?:Engines|Name|WikiWeb)|YukiWiki)
の部分の方が当てはまるのでは。 -- 2007-06-25 (月) 09:14:49サブパターン
また、キャプチャを行うものと行わないものを 合わせて、サブパターンの数は最大 200 までです。
Name | OS | PHP version | Max size of autolink.dat that works |
example | Debian sarge | 4.3.10-18 | ?? KB まではOKだった |
Ilfa | Windows Vista Ultima (32bit) Apache 2.2.4 | 5.2.2 | 16KBで○、17KBで× |
// この順番に preg_match() にかける場合 array( '/A/' // <= 'ABCD' にはこちらが先にマッチしてしまう '/ABCD/', // <= 永遠にマッチしない )
WebTrack\/(?: 1(?:0|1|2|3|4|5|6|7|8|9)? |2(?:0|1|2|3|4|5|6|7|8|9)? |3(?:0|1|2|3|4|5|6|7|8)? |4(?:0|1|2|3|4|5|6|7|8|9)? |5(?:0|1|2|3|4|5|6|7|8|9)? |6(?:0|2|3|4|6|7|8|9)? |7(?:0|1|2|3|4|5|6(?:\/てすと)?|7|8|9)? |8(?:0)? |9 )上を下に(改行位置がややいい加減)。
WebTrack\/(?: 1[0123456789]? |2[0123456789]? |3[012345678]? |4[0123456789]? |5[0123456789]? |6[02346789]? |7(?:0|1|2|3|4|5|6(?:\/てすと)?|7|8|9)? |8[0]? |9 )$result = generate_trie_regex($auto_pages) の結果を置換えているのがバレバレなんですが(つまり対処療法であって、根本解決ではない)。
パターンに記述可能な要素のうち、幾つかの要素は、他の要素よりも 効率的に処理されます。 (a|e|i|o|u) のような選択肢の集合よりも [aeiou] のような文字クラスの方が効率的です。とあったからです。サブパターンの数を減らすのにも少しは役立ちそうだったので。