J'ai un processus de messagerie par lot qui envoie environ 30 000 messages électroniques. J'ai rencontré un problème étrange : le processus est achevé à environ 85 %, puis les courriels commencent à échouer avec le message suivant Could not execute: /usr/sbin/sendmail
J'utilise une bibliothèque appelée PHPMailer 1.73 et le code correspondant d'où provient le message d'erreur est le suivant
if(!@$mail = popen($sendmail, "w"))
{
$this->SetError($this->Lang("execute") . $this->Sendmail);
return false;
}
La valeur de $sendmail
est de la forme : /usr/sbin/sendmail -oi -f support1@example.com -t
J'ai set_time_limit(0);
pour que le script n'ait pas de délai d'attente.
Y a-t-il un moyen de comprendre pourquoi tout d'un coup popen() commence à échouer ? Le système d'exploitation pourrait-il être à court de descripteurs de fichiers ou atteindre une autre limite ?
Comment dois-je résoudre ce problème ? Devrais-je faire en sorte qu'il s'endorme puis réessayer la popen() plusieurs fois avant d'échouer ?
Mise à jour : Merci à la suggestion de Marko de vérifier proc_open()
J'ai trouvé sur le documentation proc_open un commentaire indiquant que s'il retourne FALSE
cela signifie probablement que vous n'avez plus de descripteurs de fichiers ou que vous n'avez plus de mémoire. J'ai découvert que mon processus prenait 20G
de la mémoire. Mais comment peut-il prendre autant de mémoire si memory_limit
est fixé à 64M
? Eh bien, il semble que l'exécution de programmes externes avec exec()
, popen()
o proc_open()
ne comptent pas dans la limite de mémoire de PHP. Voir cette question de l'OS pour plus d'informations à ce sujet, Déboguer l'utilisation de la mémoire dans mod_php . Je ne sais toujours pas comment cela se produit, mais je soupçonne une sorte de fuite de mémoire.
En résumé, popen()
y proc_open()
peut retourner FALSE
si vous êtes à court de descripteurs de fichiers ou de mémoire.