Потоки в PHP?


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

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

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

Author: Cœur, 2010-04-06

8 answers

РЕДАКТИРОВАТЬ (спасибо @Efazati, похоже, в этом направлении появились новые разработки)

Http://php.net/manual/en/book.pthreads.php
Внимание: (из здесь внизу):

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

/РЕДАКТИРОВАТЬ

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

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

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

  • основной сценарий добавляет задания в очередь
  • скрипт cron отправляет их крошечными кусочками

Подводные камни:

  • убедитесь, что вы не отправляете электронное письмо без удаления из очереди (в худшем случае, если пользователь удаляет немного спама с интервалом в 2 минуты...)
  • убедитесь, что вы не удаляете задание, не выполнив его сначала...
  • обработка отскакивающей электронной почты с использованием алгоритма оценки
 41
Author: clyfe, 2013-01-25 17:55:29

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

 5
Author: Doug Kavendek, 2011-06-13 20:03:29

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

 3
Author: Kevin Schroeder, 2010-04-06 15:31:58

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

 3
Author: JasonDavis, 2012-10-24 04:36:50

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

 1
Author: troelskn, 2011-06-13 20:03:20

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

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

 0
Author: Neil Aitken, 2010-04-06 14:43:42

По состоянию на PHP в нем нет потоков. Однако для php вы можете взглянуть на этот окольный путь http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html

 0
Author: manugupt1, 2010-04-06 14:45:43

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

 0
Author: Elzo Valugi, 2010-04-06 14:54:52