I am creating a web application using zend, here I create an interface from where user-A can send email to more than one user(s) & it works excellent but it slow the execution time because of which user-A wait too much for the "acknowledged response" ( which will show after the emails have sent. )

In Java there are "Threads" by which we can perform that task (send emails) & it does not slow the rest application.

Is there any technique in PHP/Zend just like in Java by which we can divide our tasks which could take much time eg: sending emails.


Solution 1:

EDIT (thanks @Efazati, there seems to be new development in this direction)

http://php.net/manual/en/book.pthreads.php
Caution: (from here on the bottom):

pthreads was, and is, an experiment with pretty good results. Any of its limitations or features may change at any time; [...]

/EDIT

No threads in PHP!

The workaround is to store jobs in a queue (say rows in a table with the emails) and have a cronjob call your php script at a given interval (say 2 minutes) and poll for jobs. When jobs present fetch a few (depending on your php's install timeout) and send emails.

The main idea to defer execution:

  • main script adds jobs in the queue
  • cron script sends them in tiny slices

Gotchas:

  • make sure u don't send an email without deleting from queue (worst case would be if a user rescieves some spam at 2 mins interval ...)
  • make sure you don't delete a job without executing it first ...
  • handle bouncing email using a score algorithm

Solution 2:

You could look into using multiple processes, such as with fork. The communication between them wouldn't be as simple as with threads (but then, it won't come with all of its pitfalls either), but if you're just sending emails, it might not be necessary to communicate much, if at all.