MODx(0.961p2)でドキュメントの数に制限があるのが分からなかった。
ドキュメントを6,000個作成したら、管理画面が真っ白になった。
apacheのerror_logを見る。

[client 127.0.0.1] PHP Fatal error:  Allowed memory size of 33554432 bytes exhausted (tried to allocate 31457280 bytes) in /modxshop/assets/cache/siteCache.idx.php on line 21363
 

どうやら、Cacheのサイズに制限があるようだ。
MODxのフォーラムをみるとドキュメント数は5,000ぐらいが限界で、バージョン0.97でこの問題を解決するようなことが記載されていた。
しかし、諦めきれないので、単純にメモリを増やすことを試みる。
php.iniのメモリを増加

memory_limit = 32M      ; Maximum amount of memory a script may consume (16MB)
                                ↓
memory_limit = 64M      ; Maximum amount of memory a script may consume (16MB)

これでhttpdをrestartしたらOKだった。
しかしパフォーマンスが悪い。この際だから不要なものは整理。
siteCacheの内容をみる。ドキュメントとしての情報は以下。

$a = &$this->aliasListing;
$d = &$this->documentListing;
$m = &$this->documentMap;
$d['home'] = 1;
$a[1] = array('id' => 1, 'alias' => 'home', 'path' => '');
$m[] = array('0' => '1');
$d['feed.rss.xml'] = 51;
$a[51] = array('id' => 51, 'alias' => 'feed.rss.xml', 'path' => '');
$m[] = array('0' => '51');
$d['doc-not-found'] = 27;
$c = &$this->contentTypes;
$c[1] = 'text/html';
$c[27] = 'text/html';

これらの配列がドキュメントの数だけある。
当処理で不要な以下を削除することにした。cache_sync.class.processor.phpを改造。

  1. 配列cの’text/html’(5958個)
  2. 配列mの最下層クラス(5900個)

1.は当処理で問題なし。
2.はサイドメニュー(Wayfinder)の処理がおかしい。しかしメチャメチャ速くなる。
WayfinderはgetParentIdsで親子関係の処理ができなくなるようだ。
汎用のロジックを諦め、当処理用に独自改造してOK。
MODx0.96系ではドキュメント数が少ないコンテンツには適しているが、多くなるとパフォーマンスのためにロジックの見直しがかなり必要だと分かった。

ドキュメントが多くなると注意すべきこと

  1. SEO Strict URLs(全ドキュメントに対するrewrite処理)
  2. Wayfinder(親子関係のlevelの検索,sql)
  3. Ditto(同上)
  4. 大量のタグ(1バッファーにある大量のタグの変換)