php - PHP的popen命令失败的原因

标签 php email pipe

我有一个发送大约 30,000 封电子邮件的批处理电子邮件。我遇到了一个奇怪的问题,它完成了大约 85% 的过程,然后电子邮件开始失败并显示消息 Could not execute:/usr/sbin/sendmail 我正在使用一个名为的库PHPMailer 1.73及错误信息来源的相关代码为

if(!@$mail = popen($sendmail, "w"))
{
    $this->SetError($this->Lang("execute") . $this->Sendmail);
    return false;
}

$sendmail 的值的格式为:/usr/sbin/sendmail -oi -f support1@example.com -t

我有 set_time_limit(0); 所以脚本不会超时。

有没有办法弄清楚为什么 popen() 突然开始失败?操作系统是否会用完文件描述符或达到其他限制?

我该如何解决?我应该让它休眠然后在失败之前重试几次 popen() 吗?

更新:感谢 Marko 的建议,查看我在 proc_open documentation 上找到的 proc_open()一条注释,如果它返回 FALSE,则可能意味着您用完了文件描述符或内存不足。我发现我的进程占用了 20G 内存。但是,如果memory_limit 设置为64M 怎么会占用那么多内存呢?好吧,似乎使用 exec()popen()proc_open() 运行外部程序不计入 PHP 的内存限制。有关更多信息,请参阅此 SO 问题,Debugging memory usage in mod_php .我仍然不确定这是怎么发生的,但我怀疑某种内存泄漏。

总而言之,如果文件描述符或内存不足,popen()proc_open() 可以返回 FALSE

最佳答案

我建议改用 proc_open。它使用起来稍微复杂一些,但可以让您访问 stdout 和 stderr。这两个管道上的消息将为您节省大量调试时间。

如何使用,看PHP文档中的例子和注释即可。

关于php - PHP的popen命令失败的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5572021/

相关文章:

php - 将数据从服务器发送到 iPhone 应用程序

php - 使用 Zend_Mail 时添加 PDF 附件

.net - 如何通过电子邮件发送使用NLog记录的错误?

powershell - 在 PowerShell 中连接到 ForEach-Object

c - 使用共享内存实现管道

python - 连接正则表达式从子进程 STDERR 检索到的字符串会导致困惑

php - 提交事件后在 tr 中添加新的 td

php - 通过FB、Twitter、Linkedin等跟踪用户。PHP、Mysql

PHP 到 SMS - 更改 "From Name"

android - 仅使用 Android 中的电子邮件客户端应用程序发送电子邮件