2015-10-03 2 views
6

Laravelがnikic phpparserを内部的に使用していることを知りました。Laravel 4 nikic phpparserを使用しています。電子メールを送信するときにメモリから外に出る

私は条件が&のうちの1つで電子メールを送信するように変更しました。
PHPのログは、このことを示した:

[Sat Oct 03 21:18:23 2015] [error] [client xx.xx.xx.xx] PHP Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 1048576 bytes) in /home/yyyy/public_html/vendor/nikic/php-parser/lib/PHPParser/NodeTraverser.php on line 66, referer: 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; 
} 

これは私が電子メールを送信しています方法です。これは他のどことも変わりません。したがって、問題が発生する可能性があります。

解決方法に関するアイデアはありますか?

+0

問題はphpparserファイルの複数の場所で発生することがわかりました。 – PlanetUnknown

答えて

0

極端に低いメモリ制限があります。 IIRCのPHPの制限はデフォルトで128Mから始まります。パーサーが通過すると、コードのすべての部分のノードが構築されます。除外されるものは何もなく、簡単な修正はありません。

メモリはこれまで以上に安価であり、今後のPHP7のためにこの問題は修正される可能性は低いです。とにかくメモリフットプリントが小さくなる可能性があるので、おそらくそれを試してみてください。

関連する問題