gpt4 book ai didi

php - 使用 PHP SwiftMailer 和 SMTP 发送时事通讯

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:47 24 4
gpt4 key购买 nike

我每天向大约 20,000 名收件人发送简报。在移动到其他服务器后,我需要大约六倍的时间来使用相同的 PHP 脚本——我尝试了许多不同的设置但没有成功(please see this post)。电子邮件服务器似乎配置正确(关于垃圾邮件、中继和病毒),服务器运行 Plesk 11.5.30。

通过多次实验、更改 PHP 脚本和 Postfix 设置,我能够通过以下方式实现最佳性能:

  1. 使用 SwiftMailer 从 PHP 发送电子邮件。
  2. 使用 SMTP(本地帐户)作为传输。
  3. 将收件人列表分为四个部分,并为每个部分启动单独的 PHP-CLI 进程。

当我只启动一个进程时,PHP 每秒发送大约 5 封电子邮件(这与我使用 mail() 函数发送电子邮件时的情况大致相同)。 Postfix 可以“即时”发送它们,因此几乎不需要排队。

当我启动四个进程时,PHP 每秒发送大约 10 封电子邮件,但是 postfix 不再能够“即时”发送它们(它每秒只能发送大约 5 封电子邮件),因此队列变得越来越大。当 PHP 进程结束时,我的队列中有大约 4500 封电子邮件。有趣的部分来了:当没有更多活跃的 PHP 进程发送电子邮件时,Postfix“加速”到每秒发送大约 20 封电子邮件。当 PHP 发送新电子邮件时,Postfix 是否能够以这种速率发送电子邮件?不会有队列,它会解决我的问题。

如果我知道我可以做些什么来提高我的脚本和发送时事通讯的服务器的性能,我将不胜感激。

这是 Postfix 配置:

root@hostname:~# postconf -n 
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases, hash:/var/spool/postfix/plesk/aliases
append_dot_mydomain = no
biff = no
config_directory = /etc/postfix
disable_vrfy_command = yes
inet_interfaces = all
inet_protocols = ipv4
mailbox_size_limit = 0
mailman_destination_recipient_limit = 1
message_size_limit = 51200000
mydestination = (none), localhost, localhost.localdomain, localhost
mydomain = domain.com
myhostname = myhostname.com
mynetworks = 127.0.0.0/8 [::1]/128 my.ip.add.ress
plesk_virtual_destination_recipient_limit = 1
readme_directory = no
recipient_delimiter = +
relayhost =
sender_dependent_default_transport_maps = hash:/var/spool/postfix/plesk/sdd_transport_maps
smtp_connect_timeout = 10s
smtp_helo_timeout = 100s
smtp_send_xforward_command = yes
smtp_tls_security_level = may
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtp_use_tls = no
smtpd_authorized_xforward_hosts = 127.0.0.0/8 [::1]/128
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
smtpd_client_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_rbl_client zen.spamhaus.org
smtpd_proxy_timeout = 3600s
smtpd_recipient_restrictions = permit_mynetworks, check_client_access pcre:/var/spool/postfix/plesk/no_relay.re, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sender_restrictions = check_sender_access hash:/var/spool/postfix/plesk/blacklists, permit_sasl_authenticated, check_client_access pcre:/var/spool/postfix/plesk/non_auth.re
smtpd_timeout = 3600s
smtpd_tls_cert_file = /etc/postfix/postfix_default.pem
smtpd_tls_key_file = $smtpd_tls_cert_file
smtpd_tls_security_level = may
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtpd_use_tls = yes
transport_maps = , hash:/var/spool/postfix/plesk/transport
virtual_alias_maps = $virtual_maps, hash:/var/spool/postfix/plesk/virtual
virtual_gid_maps = static:31
virtual_mailbox_base = /var/qmail/mailnames
virtual_mailbox_domains = $virtual_mailbox_maps, hash:/var/spool/postfix/plesk/virtual_domains
virtual_mailbox_limit = 0
virtual_mailbox_maps = , hash:/var/spool/postfix/plesk/vmailbox
virtual_transport = plesk_virtual
virtual_uid_maps = static:110

最佳答案

由于您写到您的 PHP 进程每秒发送大约 5 或 20 封邮件,我假设您已经在详细测量您的 PHP 代码,所以如果这种延迟出现在 PHP 代码中,您应该已经被发现了。

阅读评论我还假设您的系统相当大,所以您有足够的 ram 和磁盘。

根据我的经验,可能导致此类延迟的一个非常常见的问题是 DNS 解析,嗯,我的意思是错误的 DNS 配置,这会导致所有延迟。但这个假设还有待证明。

另一方面,我什至记得 postfix 有一个节流配置,以避免服务器滥用。 http://www.postfix.org/TUNING_README.html

最后,如果您在 postfix 配置中没有找到任何东西,我建议您尝试使用实用程序 strace 在其执行期间调试 postfix 进程。

这是一个非常有用的实用程序,当我必须调试不常见的问题时,我经常使用它。简而言之:strace 列出了进程所做的所有系统调用。 strace 中有很多可用的选项,但我通常只使用:

strace -fp <pid of main process>

在调试期间,您将看到 postfix 主进程及其所有子进程执行的所有系统调用。如果您添加 -c 选项,那么您将看到每次系统调用所花费的时间。

关于php - 使用 PHP SwiftMailer 和 SMTP 发送时事通讯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19683214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com