Темы в PHP

Я создаю веб-приложение с помощью zend, здесь я создаю интерфейс, из которого пользователь-A может отправлять электронную почту нескольким пользователям (пользователям), и он отлично работает, но он замедляет время выполнения, из-за которого пользователь-ожидание слишком много для "подтвержденного ответа" (который будет отображаться после отправки сообщений электронной почты.)

В Java есть "Threads", с помощью которых мы можем выполнить эту задачу (отправлять сообщения электронной почты), и это не замедляет работу остальных приложений.

Есть ли какой-либо метод в PHP/Zend, как в Java, с помощью которого мы можем разделить наши задачи, которые могут занять много времени, например: отправка писем.

Спасибо..

Ответ 1

EDIT (спасибо @Efazati, похоже, в этом направлении новая разработка)

http://php.net/manual/en/book.pthreads.php
Осторожно: (из здесь внизу):

pthreads был и есть эксперимент с довольно хорошими результатами. Любое из его ограничений или возможностей может измениться в любое время; [...]

/EDIT

В PHP нет потоков!

Обходной путь заключается в том, чтобы хранить задания в очереди (например, строки в таблице с электронными письмами) и иметь cronjob для вызова вашего php script с заданным интервалом (скажем, 2 минуты) и опросом для заданий. Когда заданные задания приносят несколько (в зависимости от тайм-аута установки php) и отправляют электронные письма.

Основная идея отложить выполнение:

  • main script добавляет задания в очередь
  • cron script отправляет их в крошечные фрагменты

Gotchas:

  • убедитесь, что вы не отправляете электронное письмо без удаления из очереди (в худшем случае, если пользователь отменит спам с интервалом в 2 минуты)
  • убедитесь, что вы не удаляете задание, не выполняя его сначала...
  • обрабатывать отсканированную электронную почту с использованием алгоритма оценки

Ответ 2

Вы можете изучить несколько процессов, например fork. Общение между ними было бы не так просто, как с потоками (но тогда оно также не будет приходить со всеми его ловушками), но если вы просто отправляете электронные письма, может быть не нужно много общаться, если на все.

Ответ 3

Следите за тем, чтобы делать вилки в процессе Apache. Вы можете получить какое-то поведение, которого вы не ожидаете. Если вы хотите выполнить какое-либо асинхронное выполнение, это должно быть через какой-то механизм очередей. Гирмен - это один. Zend Server Job Queue - другая. У меня есть демо-код на Вы в очереди? Введение в очередь работы сервера Zend. Cron можно использовать, но у вас будет проблема в зависимости от вашего планировщика cron для запуска задач, тогда как асинхронные вычисления часто должны выполняться немедленно. Использование системы очередей позволяет сделать это без потоковой передачи.

Ответ 4

Существует расширение Threading, основанное на PThreads, которое выглядит многообещающим на https://github.com/krakjoe/pthreads

Ответ 5

Существует pcntl, что позволяет создавать подпроцессы, но php не работает очень хорошо для такого типа архитектура. Вероятно, вам лучше создать долговременный script (демон) и размножить их несколько.

Ответ 6

PHP не включает потоки как часть языка, есть некоторые методы, которые могут эмулировать его, но они не являются надежными.

Этот поиск Google показывает несколько возможных обходных путей

Ответ 8

Возможно, вы захотите использовать систему очередей для отправки электронной почты и отправить электронное письмо из другой системы, которая поддерживает потоки. PHP - это просто инструмент, и вы должны использовать инструмент, который лучше всего подходит для работы.