J'ai un travail cron qui envoie des emails à une liste d'abonnés, un à la fois dans une boucle foreach, avec une pièce jointe PDF. J'ai reçu ce message du script cron:Zend_Mail: Comment réparer l'erreur fatale PHP: la taille de la mémoire autorisée est-elle épuisée?
Fatal error: Allowed memory size of 94371840 bytes exhausted (tried to allocate 78643193 bytes)
Que dois-je faire pour éviter cette erreur? En outre, je suis presque sûr qu'il n'a pas fini d'envoyer à tous les abonnés, alors comment dois-je garder une trace de ceci afin qu'il sache où reprendre à nouveau s'il ne l'envoyait pas à tout le monde?
Updater: Voici un exemple de code: (J'utilise le Zend Framework en passant)
public function send(Default_Model_MyEmail $myEmail)
{
if (null != ($id = $myEmail->attachmentId)) {
$file = new Default_Model_File();
$file->find($id);
$filepath = APPLICATION_UPLOADS_DIR . '/' . $file->getActualFilename();
$attachment = new Zend_Mime_Part(file_get_contents($filepath));
$attachment->type = $file->getMimeType();
$attachment->disposition = Zend_Mime::DISPOSITION_ATTACHMENT;
$attachment->encoding = Zend_Mime::ENCODING_BASE64;
$attachment->filename = $file->getDisplayFilename();
}
$transport = new Zend_Mail_Transport_Smtp('localhost');
$mail = new Zend_Mail('utf-8');
$mail->setFrom('[email protected]', 'From Name');
$mail->setReplyTo('[email protected]');
$mail->setSubject($myEmail->subject);
if (isset($attachment)) {
$mail->addAttachment($attachment);
}
$subscribers = $this->getSubscribers();
foreach ($subscribers as $subscriber) {
$mail->addTo($subscriber->email);
$bodyText = $myEmail->body
. "\r\n\r\nIf for any reason you would like to be removed from this mailing list, "
. "please visit \r\nhttp://myapp.com/myemail/unsubscribe/email/"
. $subscriber->email;
$mail->setBodyText($bodyText);
$mail->send($transport);
$mail->clearRecipients();
}
}
Mise à jour: Je réutilisez la variable $transport
. J'étais sous l'impression que c'était la bonne façon d'envoyer à plusieurs abonnés, mais peut-être que c'est la cause? Qu'est-ce que tu penses?
Mise à jour: J'ai ajouté un tas d'instructions de journal qui impriment des instructions d'utilisation de la mémoire, mais je ne sais pas vraiment quoi faire maintenant. L'utilisation de la mémoire augmente avec chaque email. Avec une liste d'abonnés de 200, il arrive à 160 puis manque de mémoire. Que devrais-je faire?
C'est une réponse terriblement détaillée :-) –
Il est une question terriblement détaillée. – Malfist
Et pourtant toutes les autres réponses offrent un point de départ pour trouver une solution ... –