2010-10-04 3 views
0

Solution ci-dessousPHP et PEAR :: Courrier mémoire Épuisement

Salut les gars. J'ai essayé différentes manières d'approcher cela mais j'ai toujours la même erreur. J'ai un formulaire où vous pouvez sélectionner certaines adresses e-mail des utilisateurs et certains fichiers pdf et il va leur envoyer. Le problème est que PHP va lancer une erreur car le script utilise des quantités massives de mémoire (plus de 90 meg). J'ai essayé d'employer mail() et essaye maintenant PEAR: Mail_Mime Y at-il une autre manière que je peux faire ceci?


include_once('Mail.php'); 
include_once('Mail/mime.php'); 
$from = "[email protected]"; 
$subject = $_POST[subject]; 
$text = $_POST[message]; 

if (count($_POST[emailEnq]) > 0) { 
foreach ($_POST[emailEnq] as $Ekey => $Evalue) { 
    $message = new Mail_mime(); 
    $message->setTXTBody($text); 
    if (count($_POST[emailFile]) > 0) { 
    foreach ($_POST[emailFile] as $key => $value) { 
    $filepath = "/home/mds07/console/admin/media/listings/" . $_POST[list_ID] . "/docs/"; 
    ////////////////////You will need to change the above line if the location of the PHP program ever moves//////////////////////////// 
    $fileatt = $filepath . $value; 
    $message->addAttachment($fileatt); 
    } 
    } 
    $body = $message->get(); 
    $extraheaders = array("From" => $from, "Subject" => $subject); 
    $headers = $message->headers($extraheaders); 
    $mail = Mail::factory("mail"); 
    $mail->send($Evalue, $headers, $body); 
} 
} 

SOLUTION
Le code suivant fonctionne avec une meilleure utilisation de la mémoire:

 
$from = "[email protected]";

echo 'From: '.$from."\n"; echo 'Subject: '.$_POST[subject]."\n"; echo 'Text: '.$_POST[message]."\n";

include_once('Mail.php'); include_once('Mail/mime.php'); $message = new Mail_mime(); $message->setTXTBody($_POST[message]); if (count($_POST[emailFile]) > 0) { foreach ($_POST[emailFile] as $key => $filename) { $filepath = "/home/mds07/console/admin/media/listings/" . $_POST[list_ID] . "/"; ////////////////////You will need to change the above line if the location of the PHP program ever moves//////////////////////////// $fileatt = $filepath . $filename; $message->addAttachment($fileatt); echo 'Attached File: '.$filename."\n"; } } $body = $message->get(); $extraheaders = array("From" => $from, "Subject" => $_POST[subject]); $headers = $message->headers($extraheaders); $mail = Mail::factory("mail"); if (count($_POST[emailEnq]) > 0) { foreach ($_POST[emailEnq] as $key => $recipient) { $mail->send($recipient, $headers, $body); echo 'Sent mail to: '.$recipient."\n"; } }

Répondre

1

Without having used Pear::Mail_Mime I'd bet you run out of memory because you create a brand new Mail_Mime() objet à chaque itération de la boucle, quand il semble que c'est la même dans tous.

Créez le moins possible, en le sortant du foreach le plus éloigné.

Idem pour $mail. Vous pouvez probablement réutiliser le même objet $mail et le nourrir de nouveaux en-têtes et corps. Pour vous assurer que votre mémoire est utilisée, entourez les lignes suspectes avec memory_get_usage() et connectez-vous à sa sortie pour voir l'augmentation.

+1

C'est génial. Pensez à ajouter votre nouveau code de travail à votre question pour un look plus complet, au lieu de l'avoir dans une réponse par vous-même. – Fanis