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を分散したほうがいいんですけどね…。


コメント