Темы в PHP? - PullRequest
       33

Темы в PHP?

29 голосов
/ 06 апреля 2010

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

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

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

Ответы [ 8 ]

41 голосов
/ 06 апреля 2010

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

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

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

/ EDIT

Нет потоков в PHP!

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

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

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

Получено:

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

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

3 голосов
/ 24 октября 2012

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

3 голосов
/ 06 апреля 2010

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

1 голос
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...