WordPressのdbDelta()

December 29 2011, 2:46am

WordPressのdbDelta()関数で、ハマったのでメモ。

dbDelta()関数は、CREATE TABLE文などを実行する際に、既に存在するテーブルかをチェックして、存在すればALTER TABLE文に変換してくれる便利なもの。

ですが、マルチサイトを運営していて、抱えているブログ数が増えてくると、このdbDelta()関数内で"SHOW TABLES"クエリーを投げる箇所がネックになってきます。DB内の全てのテーブルを列挙するので、SHOW TABLEの結果が数千〜数万になってくるとメモリ不足となり、エラーも吐かずにプロセスがスタックします。

どのタイミングで落ちるかというとブログ作成のタイミング。wpmu_create_blog()内のdbDelta()が呼ばれたところで落ちてしまいます。アカウントの新規登録、ブログの新規作成という結構、困る場所です。

BuddyPressを利用しているので、ブログの新規作成はBuddyPressテンプレート(/wp-content/themes/theme_name/blogs/create.php)でini_set()を実行して解決。

ちょっと困ったのが、アカウントの新規登録のタイミング。どこかのフィルタかアクションをフックして

@ini_set('memory_limit', '128M');

というような感じでメモリ上限を上げたいと考えたのですが、あまり良い場所が無いんですね。仕方なく、random_passwordフィルタをフックして、メモリ上限を上げる方法を取りました。

と、いっても対処療法なので、この問題で困る前にDBを分散したほうがいいんですけどね…。

Your favourite external commenting service goes here! I recommend http://www.disqus.com