2015-10-03 12 views
6

Sadece nikic phpparser'ı dahili olarak kullanarak Laravel'i öğrendim.nikic phpparser kullanarak Laravel 4: e-posta gönderirken bellekten çıkılıyor

Kodumu değiştirmeye başladığım & koşullarından birinde e-posta göndererek kodumu değiştirdim.

[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

geçici Sorunu çözmeye hafızayı artırdık:
PHP günlükleri bunu gösterdi.
Ancak, grup yardımından uzaklaşmak istiyorum. Ben e-posta yolluyorum nasıl

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; 
} 

budur:
O soruna neden olur, NodeTraverser fonksiyonu bir klon yaptığını görüyoruz.

    $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('[email protected]', $user->username); 
         } 
        ); 

üzerinde herhangi fikirleri nasıl bu sorunu çözmek için: Bu nedenle bu bir soruna neden olur şüphe başka yerlerden çok farklı değildir?

+0

Şimdi, sorunun phpparser dosyalarındaki birden çok yerde olduğunu görüyorum. – PlanetUnknown

cevap

0

Sadece aşırı düşük bellek sınırına sahipsiniz. IIRC PHP limiti bir varsayılan için 128M'de başlar. Ayrıştırıcı geçtiğinde, kodun her bir parçası için bir düğüm oluşturuyor. Hiçbir şey hariç tutuldu ve kolay bir düzeltme yok.

Bellek, günümüzde her zamankinden daha ucuzdur ve bu sorun, yaklaşan PHP7'den dolayı sabittir. Belki de, daha küçük bir bellek ayak izine sahip olma ihtimalinin bir denemesini deneyebilirsiniz.