Zend Framework: ekleri ile birden fazla e-postalar göndermek için Zend Posta Aktarımı'nı kullanmaya çalışıyorum Ölümcül hata

3 Cevap php

Ben tamamen bütün bu işleri nasıl anlamıyorum, ama ben bu hatayı alıyorum:

Ölümcül hata: hattında 213 üzerinde / Users / andrew / Siteler / myApp / library / Zend / Mail / Ulaştırma / Smtp.php (261.858 bayt ayırmaya çalıştı) tükenmiş 8388608 bayt İzin bellek boyutu

Ben çalışan Mac MAMP yerel Bu kod koşuyorum. Bunun ile ilgisi olmadığından emin değil. Bu temelde, benim kodudur:

$config = array('ssl' => 'tls', 'port' => 587, 'auth' => 'login', 'username' => 'username', 'password' => 'password');
    $smtpConnection = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);

	foreach ($subscribers as $subscriber) {
		$message = new Zend_Mail('utf-8');
		$message->setFrom('my@mailinglist.com', 'Mailing List')
				->addTo($subscriber->email)
				->setSubject($subject)
				->setBodyText($body);
		$attachment = $message->createAttachment(file_get_contents($filepath));
		$attachment->type = 'application/pdf';
		$attachment->filename = $filename;
		$message->send($smtpConnection);
	}

Ancak, orada daha fazla abone, daha yüksek bu sayı alma biter, ve bu düzeltmenin, yalnızca bu kadar uzun süre yardımcı olacaktır:

ini_set("memory_limit","12M");

Ben bir kaç yüz kişiye eki olan bir e-posta göndermek için nasıl anlamaya gerekir. İşte ben geldim başka bir şey var ama sadece adres Bcc ayarlamak değil, biraz hacky görünüyor:

$message = new Zend_Mail('utf-8');
	$message->setFrom('my@mailinglist.com', 'Mailing list')
			->setSubject($subject)
			->setBodyText($body);
	$attachment = $message->createAttachment(file_get_contents($filepath));
	$attachment->type = 'application/pdf';
	$attachment->filename = $filename;

	foreach ($subscribers as $subscriber) {
		$message->addBcc($subscriber->email);
	}
	$message->send($smtpConnection);

Ancak, bu bile yapıyor, ben "memory_limit" belirtmeniz gerekir. Bu ile bana doğru yönde işaret edebilir? Ben yapmıyorum bir şey var mı?

3 Cevap

Ben pdf 250Kbytes ilgili olduğunu tahmin ediyorum? Eğer göndermek e-posta başına bir kere belleğe okuyoruz. Yapmak değil. Bir kez okuyun. :) Ayrıca Zend çerçevesinde bir kodlama-şey olabilir.

  • File_get_contents () arayın once Eğer döngü önce
  • (Ben 32-128 Mbyte çizgisinde söylemek istiyorum) çok daha yüksek sürece sunucu hallederim gibi hafıza sınırını ayarlayın
  • unset () ve değişkenler - (teoride) bunu GC php zorlamak gerekir
  • Sen $ ileti nesneyi yeniden olabilir (çirkin kesmek, ama Zend dosya kodlama çeşit yapar ve bellek çok kullanıyorsa bayt kurtarabilir)

Ben de e-posta göndermek ve her e-posta (veya ona referans) bir statü ile birlikte veritabanında saklanır emin yapmak için bir cron işi yapmak istiyorum. Başka bir bellek sınırı veya hata isabet varsa, bu şekilde yinelenen postaları göndermek olmaz.

Her mesaj ile yeni bir eki oluşturmak için gerek yok. Sadece bir kez oluşturun ve sonra onu göndermek her zaman takın.

$config = array('ssl' => 'tls', 'port' => 587, 'auth' => 'login', 'username' => 'username', 'password' => 'password');
$smtpConnection = new Zend_Mail_Transport_Smtp('smtp.gmail.com', $config);

$attachment = new Zend_Mime_Part(file_get_contents($filepath));
$attachment->type = 'application/pdf';
$attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->filename = $filename;

foreach ($subscribers as $subscriber) {
    $message = new Zend_Mail('utf-8');
    $message->setFrom('my@mailinglist.com', 'Mailing List')
    		->addTo($subscriber->email)
    		->setSubject($subject)
    		->setBodyText($body);
    $message->addAttachment($attachment);
    $message->send($smtpConnection);
}

Ben hafıza sınırı ve mesajları bir sürü için bir SMTP bağlantısı ile gönderme ile benzer bir sorun vardı. * Zend_Mail_Protocol_Abstract * bellekte kendi iç günlüğünü tutar. Günlüğündeki tüm posta isteklerini orada kaydedilir. Günlük gönderilen her mesaj ile büyüyor. Sen bazen $ protokol-> resetlog () çağırmak zorundadır. (Bu her mesaj için veri miktarına bağlıdır Sen memory_get_usage () PHP fonksiyon tarafından bellek kullanımını kontrol edebilirsiniz.). Böyle bir şey deneyin:

  $transport = new Zend_Mail_Transport_Smtp();
  $protocol = new Zend_Mail_Protocol_Smtp('localhost');
  $protocol->connect();
  $protocol->helo('localhost');
  $transport->setConnection($protocol);
  foreach(){
    $mail = new Zend_Mail('utf-8');
    ...
    $protocol->rset();
    $mail->send($transport);
    $protocol->resetLog();  // you don't need to resetLog for each message
  }

Bu da yararlı olabilir: http://framework.zend.com/manual/en/zend.mail.multiple-emails.html