By default, php mail() is using sendmail, using a 3 steps process:

  • mail() forks sendmail process
  • sendmail attempts to send message to destination server
  • sendmail returns to mail() when the message is sent

On a large batch of emails, you'll want to reduce the time spent of each mail() call.

Enter background delivery mode.

Update your your php.ini with:

sendmail_path = /usr/sbin/sendmail -t -i -O DeliveryMode=b

This sets the delivery mode to background: the MTA will put the message in the queue and sendmail will return almost instantly in mail().

Note: If you're using Postfix as you MTA, it seems that this option is not necessary, since Postfix is not monolithic and always queues the message [see Postfix mailing lists].