Потоки в PHP?
Я создаю веб-приложение с помощью zend, здесь я создаю интерфейс, из которого пользователь может отправлять электронную почту нескольким пользователям, и он отлично работает, но замедляет время выполнения, из-за которого пользователь слишком долго ждет "подтвержденного ответа" (который будет отображаться после отправки электронных писем.)
В Java есть "Потоки", с помощью которых мы можем выполнять эту задачу (отправлять электронные письма), и это не замедляет работу остальных приложений.
Есть ли в PHP/Zend какая-либо техника, подобная в Java, с помощью которого мы можем разделить наши задачи, которые могут занять много времени, например: отправка электронных писем.
8 answers
РЕДАКТИРОВАТЬ (спасибо @Efazati, похоже, в этом направлении появились новые разработки)
Http://php.net/manual/en/book.pthreads.php
Внимание: (из здесь внизу):
Pthreads был и остается экспериментом с довольно хорошими результатами. Любые его ограничения или функции могут измениться в любое время; [...]
/РЕДАКТИРОВАТЬ
В PHP нет потоков!
Обходной путь заключается в хранении заданий в очереди (скажем, строк в таблице с электронными письмами) и попросите cronjob позвонить вашему php-скрипту с заданным интервалом (скажем, 2 минуты) и опросить о вакансиях. Когда появятся задания, выберите несколько (в зависимости от времени ожидания установки вашего php) и отправьте электронные письма.
Основная идея отложить выполнение:
- основной сценарий добавляет задания в очередь
- скрипт cron отправляет их крошечными кусочками
Подводные камни:
- убедитесь, что вы не отправляете электронное письмо без удаления из очереди (в худшем случае, если пользователь удаляет немного спама с интервалом в 2 минуты...)
- убедитесь, что вы не удаляете задание, не выполнив его сначала...
- обработка отскакивающей электронной почты с использованием алгоритма оценки
Вы можете рассмотреть возможность использования нескольких процессов, например, с помощью вилки. Общение между ними было бы не таким простым, как с потоками (но тогда оно также не будет сопровождаться всеми его подводными камнями), но если вы просто отправляете электронные письма, возможно, не потребуется много общаться, если вообще.
Следите за выполнением форков в процессе Apache. Вы можете получить некоторые модели поведения, которых вы не ожидаете. Если вы хотите выполнить какое-либо асинхронное выполнение, это должно быть сделано с помощью какого-то механизма очереди. Гирман - один из них. Очередь заданий сервера Zend - это другое. У меня есть демонстрационный код в Вы стоите в очереди? Введение в очередь заданий сервера Zend. Cron можно использовать, но у вас возникнет проблема зависимости от вашего планировщика cron для выполнения задач, в то время как асинхронные вычисления часто его нужно запускать немедленно. Использование системы очередей позволяет сделать это без потоковой передачи.
На основе PThreads разрабатывается расширение для потоков, которое выглядит многообещающим в https://github.com/krakjoe/pthreads
Существует pcntl, который позволяет создавать подпроцессы, но php не очень хорошо работает для такого рода архитектуры. Вероятно, вам лучше создать долговременный скрипт (демон) и создать несколько из них.
PHP не включает потоковую обработку как часть языка, есть некоторые методы, которые могут ее эмулировать, но они не являются надежными.
Этот поиск в Google показывает несколько потенциальных обходных путей
По состоянию на PHP в нем нет потоков. Однако для php вы можете взглянуть на этот окольный путь http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html
Возможно, вы захотите использовать систему очередей для отправки электронной почты и отправить электронное письмо из другой системы, которая поддерживает потоки. PHP - это всего лишь инструмент, и вы должны выбрать инструмент, который лучше всего подходит для этой работы.