Posted at

バッチで大量クエリ発行するときは、XoopsLogger::addQueryを無効化する

More than 5 years have passed since last update.

XOOPS CubeにはXoopsLoggerというログ記録クラスがあります。

発行されたSQLクエリもこのクラスで記録されてるので、AdelieDebugやRyusDebugでロガーからクエリログを取り出して表示することができます。

これはこれで開発中にうっかりSQLエラーをだしてしまったときにすぐに気がつけて便利なのですが、バッチ処理で大量のクエリを発行するときにちょっと問題になってきます。


メモリ大量消費

XoopsLoggerでは発行したクエリをどんどん配列にためこむだけなので、バッチで大量にクエリを発行するとメモリ消費量がどんどん増大します。

(これが原因でバッチが途中で止まってしまったので、このメモを書いています(^^;)


XoopsLoggerでクエリ記録無しを選べるようにする

XOOPS_ROOT_PATH/class/logger.php 110行目あたり

    function addQuery($sql, $error=null, $errno=null)

{
$this->queries[] = array('sql' => $sql, 'error' => $error, 'errno' => $errno);
}

こんなコードになってるので、これを下記の様に修正します。

    function addQuery($sql, $error=null, $errno=null)

{
if(defined('XOOPS_LOGGER_ADDQUERY_DISABLED') && XOOPS_LOGGER_ADDQUERY_DISABLED){
return;
}
$this->queries[] = array('sql' => $sql, 'error' => $error, 'errno' => $errno);
}

で、バッチ処理の頭に

define('XOOPS_LOGGER_ADDQUERY_DISABLED', true);

って追加しておけばバッチ処理だけクエリをためこまなくなります。

デバッグ時にロガーにクエリログ残したいとおもったら、

define('XOOPS_LOGGER_ADDQUERY_DISABLED', false);

で一時的にクエリログ残して、参照という手もありますね。