Laravel が内部的に nikic phpparser を使用していることを知りました。
条件の 1 つでメールを送信するようにコードを変更したところ、停止し始めました。
PHPログはこれを示しました:
[2015 年 10 月 3 日 21:18:23] [エラー] [クライアント xx.xx.xx.xx] PHP 致命的なエラー: /home/yyyy/public_html/ で 33554432 バイトの許容メモリ サイズが使い果たされました (1048576 バイトを割り当てようとしました) vendor/nikic/php-parser/lib/PHPParser/NodeTraverser.php の 66 行目、リファラー: http://yyyy.com/home
問題を解決するために一時的にメモリを増やしました。
でも、バンドエイドから離れたい。
NodeTraverser 関数がクローンを実行していることがわかります。それが問題の原因になるでしょうか。
protected function traverseNode(PHPParser_Node $node)
{
ini_set('memory_limit', '64M'); // temporary fix
$node = clone $node;
foreach ($node->getSubNodeNames() as $name) {
$subNode =& $node->$name;
if (is_array($subNode)) {
$subNode = $this->traverseArray($subNode);
} elseif ($subNode instanceof PHPParser_Node) {
foreach ($this->visitors as $visitor) {
if (null !== $return = $visitor->enterNode($subNode)) {
$subNode = $return;
}
}
$subNode = $this->traverseNode($subNode);
foreach ($this->visitors as $visitor) {
if (null !== $return = $visitor->leaveNode($subNode)) {
$subNode = $return;
}
}
}
}
return $node;
}
こんな感じでメールを送ります。これは他の場所と変わらないため、これが問題を引き起こすとは思えません。
$this->mailer->queue('emails.forreg',
[
'toName' => $toEmailName,
'fromName' => $user->username,
'site_name' => \Config::get('site_title')
],
function($mail) use($toEmailAddress, $user, $subject_to_send, $toEmailName)
{
$mail->to($toEmailAddress, $toEmailName)
->subject($subject_to_send)
->from('xxx@yyy.com', $user->username);
}
);
これを解決する方法についてのアイデアはありますか?