Tôi gửi bản tin hàng ngày cho khoảng 20 nghìn người nhận. Sau khi chuyển sang máy chủ khác, tôi cần khoảng sáu lần thời gian để sử dụng cùng một tập lệnh PHP - Tôi đã thử nhiều cài đặt khác nhau nhưng không có may mắn với nó (please see this post). Máy chủ email có vẻ được cấu hình đúng (liên quan đến spam, relay và virus), máy chủ chạy với Plesk 11.5.30.Gửi bản tin bằng cách sử dụng PHP SwiftMailer và SMTP
Làm nhiều thí nghiệm, thay đổi kịch bản PHP và các thiết lập Postfix tôi đã có thể đạt được hiệu quả tốt nhất như sau:
- Gửi email từ PHP sử dụng SwiftMailer.
- Sử dụng SMTP (tài khoản cục bộ) làm phương tiện giao thông.
- Chia danh sách người nhận thành bốn phần và bắt đầu quá trình PHP-CLI riêng biệt cho từng phần.
Khi tôi bắt đầu chỉ có một quy trình, PHP gửi khoảng 5 email/giây (giống như khi tôi gửi email bằng chức năng mail()). Postfix không có vấn đề gì với việc gửi chúng "trên đường bay", vì vậy không có hàng đợi nào cả.
Khi tôi bắt đầu bốn tiến trình, PHP gửi khoảng 10 email/giây, tuy nhiên postfix không thể gửi chúng được nữa “(Nó có thể gửi chỉ khoảng 5 email/giây) để hàng đợi trở nên lớn hơn và lớn hơn. Khi quá trình PHP kết thúc, tôi có khoảng 4500 email trong hàng đợi của tôi. Và đây là phần thú vị: khi không có PHP hoạt động nhiều hơn quy trình gửi email, Postfix „tăng tốc" để gửi khoảng 20 email/giây. Postfix có thể gửi email với tốc độ này trong khi PHP đang gửi email mới không? Sẽ không có hàng đợi và nó sẽ giải quyết được sự cố của tôi. Tôi sẽ đánh giá cao bất kỳ ý tưởng nào tôi có thể làm để cải thiện hiệu suất của tập lệnh của mình và máy chủ gửi bản tin.
Ở đây có cấu hình 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
Nếu Postfix trở nên nhanh hơn khi quá trình PHP của bạn kết thúc, có thể bạn gặp sự cố CPU? 'Top' nói gì khi các tiến trình PHP đang chạy? Bạn đang sử dụng máy chủ chia sẻ hoặc VPS? Spec gì? – halfer
Chúng tôi sử dụng một máy chủ chuyên dụng mà thực sự không có nhiều việc phải làm. CPU và bộ nhớ không phải là vấn đề - chúng tôi có đủ tài nguyên (tôi đã kiểm tra lại lần này hôm nay trong khi chúng tôi gửi bản tin của chúng tôi). Chạy iostat -m -x -d 5 Tôi thấy có sử dụng đĩa rất cao (% util lên đến 100% - khi PHP và Postfix được thực hiện nó là khoảng 10% - điều này có liên quan gì đến vấn đề hiệu năng của chúng ta không?) Tôi không undrestand là, tại sao PHP trên máy chủ mới có thể gửi trong một quá trình tối đa 5-7 thư/giây (nếu bạn chỉ chạy một quá trình), trong khi máy chủ cũ của chúng tôi đã có thể gửi 20 và nhiều hơn nữa mỗi giây. – Okizb
Tôi không phải là một chuyên gia về các vấn đề máy chủ, nhưng 100% của bất cứ điều gì sẽ có giá trị điều tra thêm, chắc chắn. Liệu nó có nói PHP và Postfix nào chịu trách nhiệm về mức sử dụng đó không? – halfer