create_functionをループの中で使うとメモリを消費する

Agaviのソースを眺めていてるとcreate_functionをループの中で使っていたので少し気になったので調べてみた。

<?php
    for($i=0; $i < 20000; $i++) {
        create_function('$match',
                        '$constant = $match[1];' .
                        'return (AgaviConfig::has($constant) ? AgaviConfig::get($constant) : "%".$constant."%");'
                        );
    }

これを実行したら案の定

PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 4864 bytes)

と言われてしまった。律儀にも同じ内容の関数を毎回定義していらっしゃるようだ。
ということで、ループの中でcreate_functionするのはあまりお勧めできないという結論に達した。

PHP側で同じ内容の関数は再定義しないようにキャッシングとかしてくれるといいかもな。いやしかし、そうすると関数定義のオーバーヘッドが多くなるか。などと考える次第です。