我每天發送一份簡報給大約20K個收件人。移動到其他服務器後,我需要使用相同的PHP腳本多六倍的時間 - 我嘗試了許多不同的設置,但沒有運氣(please see this post)。電子郵件服務器似乎已經正確配置(關於垃圾郵件,中繼和病毒),服務器將在Plesk 11.5.30中運行。使用PHP SwiftMailer和SMTP發送簡報
做大量的實驗,改變PHP腳本和Postfix的設置,我能夠實現與下面的最佳性能:從PHP使用SwiftMailer
- 發送電子郵件。
- 使用SMTP(本地帳戶)作爲傳輸。
- 將收件人列表分爲四部分,併爲每個部分啓動單獨的PHP-CLI過程。
當我只啓動一個進程時,PHP發送大約5封電子郵件/秒(與使用mail()函數發送電子郵件時大致相同)。 Postfix在「即時」發送時沒有任何問題,所以沒有任何隊列。
當我開始四個進程時,PHP發送大約10封電子郵件/秒,但是postfix無法發送「on the fly 「(它每秒只能發送大約5封電子郵件),所以隊列變得越來越大,當PHP進程結束時,我的隊列中有大約4500封電子郵件,這裏有一個有趣的部分:當沒有更多的活動PHP進程發送電子郵件,Postfix「加速」發送大約20封電子郵件/秒。Postfix能夠以這種速度發送電子郵件,而PHP正在發送新的電子郵件嗎?將不會有隊列,它會解決我的問題。我希望我能做些什麼來改進腳本的性能和服務器發送通訊。
這裏談到的Postfix配置:
[email protected]:~# 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進程完成後Postfix變快了,也許你有CPU問題?當PHP進程正在運行時,「top」是什麼意思?你在共享服務器上還是VPS?什麼規格? – halfer
我們使用專門的服務器,實際上並沒有太多的事情要做。 CPU和內存不是問題 - 我們有足夠的資源(當我們發送新聞時,我再次檢查了這一點)。運行iostat -m -x -d 5我發現磁盤使用量非常高(%util高達100% - 當PHP和Postfix完成時,它大約有10% - 這可能與我們的性能問題有關嗎?)爲什麼新服務器上的PHP能夠以最大5-7個郵件/秒發送一個進程(如果只運行一個進程),而我們的舊服務器能夠每秒發送20個或更多進程,爲什麼呢? – Okizb
我不是服務器問題的專家,但是當然,100%的任何事情都值得進一步調查。它是否說明PHP和Postfix中的哪一個對這種使用級別負責? – halfer