Изучим все детали основных сервисов передачи сообщений доступных в PHP.
- Семафоры
- Gearman
- JMS с PHP:
- QUERCUS
- PHPMQ->MANTARAY
1. Семафоры
Semaphore — это PHP модуль, который на самом делал состоит из трех расширений, и включает в себя семафоры, разделяемую память и межпроцессное взаимодействие (IPC). Этот модуль предоставляет обертки к семейству функций System V IPC; чтобы использовать его в PHP, вам нужно включить этот модуль вручную, так как по умолчанию он отключен; чтобы включить поддержку System V семафоров используйте флаг --enable-sysvsem при компиляции, для включения разделяемой памяти скомпилируйте PHP с --enable-sysvshm, и для включения System V сообщений скомпилируйте PHP с опцией --enable-sysvmsg.
Заметка: модуль семафоров недоступен на платформе Windows.
Для использования модуля межпроцессного взаимодействия (IPC) имеется набор функций, перечисленных далее:
- msg_get_queue: Создать очередь или присоединиться к ней.
resource msg_get_queue ( int $key [, int $perms = 0666 ] )
Возвращает id, которое можно использовать для доступа к очереди сообщений System V с переданным ключом. - msg_queue_exists: Возвращает статус существования очереди сообщений.
bool msg_queue_exists ( int $key)
- msg_receive: Получает сообщение из определенной очереди сообщений.
bool msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize ,mixed &$message [, bool $unserialize = true [, int $flags = 0 [, int &$errorcode ]]] )
Получит первое сообщение из определенной очереди определенного в desiredmsgtype типа. - msg_remove_queue: Уничтожает очередь сообщений.
bool msg_remove_queue ( resource $queue )
Разрушает очередь сообщений, определённую в queue. Функцию следует использовать для освобождения ресурсов, занятых очередью, только когда все процессы, использующие эту очередь, завершили работу. - msg_send: Добавляет одно сообщение в очередь.
bool msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [,bool $blocking = true [, int &$errorcode ]]] )
Отправляет сообщение с типом, определенным в msgtype, в очередь, определенную в queue. Тип сообщения должен быть > 0. - msg_set_queue: Устанавливает свойства очереди сообщений.
bool msg_set_queue ( resource $queue , array $data )
Позволяет вам изменять значения, относящиеся к нижележащим процессам хранения очереди. - msg_stat_queue: Возвращает информацию о свойствах очереди.
array msg_stat_queue ( resource $queue )
Возвращает мета-данные.
2. Gearman
Gearman — это фреймворк приложения, используемый для позволения приложениям выполнять задания в параллельном режиме, а также для вызова функций одного языка из другого. Этот фреймворк можно использовать в самых разных приложениях: от high-availability web-сайтов до передачи событий, используемых при репликации баз данных, и состоит из двух основных компонентов: сервер задач и API; API для клиента и API для процесса-работника. Клиентское и API воркера может использоваться в широком спектре языков; сервер задач доступен только как C и Perl библиотеки. Этот выбор делает сложным запуск сервера на платформе Windows.
Вы можете установить фреймворк приложения Gearman двумя способами:
- Используя чистое PHP API, названное Net_Gearman, используя команду pear install Net_Gearman.
- Как PHP расширение используя это руководство www.phpvs.net/2010/11/30/installing-gearman-and-gearmand-on-windows-with-cygwin/. Это расширение предлагает ООП-интерфейс для написания Gearman-клиентов и воркеров.
3. JMS с PHP через Quercus
Как вы наверняка знаете, большинство функций JMS спроектированы для сервисов, управляемых сообщениями, которые в мире Java как нельзя кстати, но не применимо к PHP. Для того, чтобы использовать эти особенности, вам нужно реализовать Java используя технологию, в данном случае, Quercus.
Сервис сообщений Java (JMS) — это стандарт передачи сообщений, который позволяет компонентам приложения (Java EE приложения) отправлять и принимать сообщения. Коммуникация также может быть и асинхронная (поставщик JMS может доставлять сообщения клиенту по мере их поступления; при этом клиент на обязан самостоятельно запрашивать сообщения) и достоверная (JSM API будет проверять, что одно сообщение не будет доставлено более одного раза. Слабые уровни надежности доступны для приложений, который могут позволить упустить сообщение или же принять его дважды).
Quercus — это 100% java-реализация PHP5, принадлежащая Caucho Technology, выпущенная под open-source лицензией GPL. Quercus включает много PHP модулей и расширений: PDF, PDO, MySQL, JSON, а также позволяет связывать Java-сервисы с PHP так, что использование PHP с JSM очень удобно. Quercus ещё предлагает удобный интерфейс отправки сообщений, использующий JMS; это позволяет отправлять и принимать сообщения, используя реализацию Resin JSM или же другую реализацию JMS, что вы увидите в следующей секции. Установка и использование Quercus возможна двумя способами, которые мы представим в этой части:
Resin Web-server
С помощью Resin Web-Server (http://caucho.com/products/resin/download), Quercus является частью Resin Application Server и встроен в Resin — таким образом нет никакой необходимости в дополнительные установках. Для установка Resin на Windows, проследуйте шагам из www.caucho.com/resin-3.1/doc/resin-web-server.xtp#GettingStarted. Для проверки установки resin посетите localhost:8080 в браузере.
Для использования JMS в Quercus, сконфигурирейте JMS для PHP и JAVA, для этого вам нужно установить ConnectionFactory и Queue, оба находятся в файле resin-web.xml в каталоге WEB-INF.
resin-web.xml
<web-app xmlns="http://caucho.com/ns/resin"
xmlns:resin="urn:java:com.caucho.resin">
<!-- - JMS MemoryQueue -->
<resin:MemoryQueue>
<Named>Queue</Named>
</resin:MemoryQueue>
<resin:JmsConnectionFactory/>
<!--
- MyListener receives messages from the queue and stores them in
- the MessageStore
-->
<ejb-message-bean class="example.MyListener">
<destination>#{Queue}</destination>
</ejb-message-bean>
</web-app>
Программная модель интерфейса Quercus предполагает, во-первых, получить доступ к очереди используя вызов java_bean(), которая найдет именнованный объект в файле resin-web.xml, в данном случае это очередь. Именно потому, что Queue реализует интерфейс java.util.concurrent.BlockingQueue, PHP скрипт имеет возможность немедленно отправлять данные в очередь с помощью offer() и получать их с помощью poll().
<?php
if (array_key_exists("message", $_POST)) {
$queue = java_bean("Queue");
if (! $queue) {
echo "Unable to get message queue!n";
} else {
if ($queue->offer($_POST["message"]) == TRUE) {
echo "Successfully sent message '" . $_POST["message"] . "'";
} else {
echo "Unable to send message '" . $_POST["message"] . "'";
}
}
}
?>
Скрипт проверяет POST['message'], и если она установлена, отправляет содержимое в очередь. MBD (Message-driven Bean) получает эти сообщения и записывает их. Результат отображается сервлетом.
NetBeans IDE и GlassFish
Еще один способ установки Quercus предоставляет NetBeans IDE и GlassFish в качестве сервера. Для использования Quercus с NetBeans нужно:
- Разархивировать quercus-4.0.39.war (http://quercus.caucho.com/) и скопировать jar-файлы из «WEB-INF/lib» в другой каталог «GLASSFISH_HOME/domains/domain/lib».
- Создать новый проект веб-приложения — «PHPexample» в NetBeans IDE и выбрать GlassFish в качестве сервера:
Структура директорий после нажатия на Finish.
- В каталоге WEB-INF создайте файл web.xml (если он не был создан ранее): File > New > Empty. Вставьте в него следующий текст и сохраните:
web.xmlweb.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <description>Caucho Technology's PHP Implementation, Running on GlassFish Java EE 5</description> <servlet> <servlet-name>Quercus Servlet</servlet-name> <servlet-class>com.caucho.quercus.servlet.QuercusServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>Quercus Servlet</servlet-name> <url-pattern>*.php</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.php</welcome-file> </welcome-file-list> </web-app>
Таким образом мы объявили сервлет из PHP.
- В основном проекте, «PHPexample», создайте PHP файл, назовите его index.php, заполните этим:
index.phpindex.php
<?php echo "Hello World!"; phpinfo(); ?>
Эта страница печатает «Hello World!» в браузер и некоторую конфигуацию PHP.Структура директорий должна выглядеть следующим образом:
Обратите внимание, что «index.jsp» всего лишь файл-шаблон для начала работа с JSP, is only a template file to get started with JSPs, но не относится к этому тесту.
- Запустите PHP приложение через GlassFish на localhost:8080/PHPexample/index.php/ и вы должны получить вывод, приведенный ниже.
Как только вы получили работающий Quercus в NetBeans IDE и сервер GlassFish, можете попробовать использовать все возможности JMS и других расширений, поставляемых с Quercus.
4. JMS с PHP через PHPMQ
PHPMQ — открытый инструментарий передачи сообщений для PHP, дающий разработчику возможность проводить JMS операции, такие как отправка и прием сообщений по очередям / темам, при этом обеспечивая доставку и постоянное хранение сообщений. Она открывает новые возможности для PHP-разработчиков, которые теперь могут получать доступ к данным, которые обычно доступны только серверам приложения и старым решениям передачи сообщений.
PHPMQ Mantaray является распределенной, пиринговой, бессерверной системой для коммуникации и передач сообщений для JAVA (JMS), C++ и .NET. Она гарантирует доставку, безопасность и поддерживает протоколы TCP, SSL & HTTP.
- Скачать и установить шину сообщений MantaRay
- Настроить MantaRay: включить RMI интерфейс и создать RMI регистр (подробнее в документации RMI API проекта mantaray).
- Запустить mantaray как автономное приложение
- Включить php-java расширение в php.ini — подробнее на www.php.net/manual/en/ref.java.php
- Добавить phpmq.jar (находится в этом zip архиве) и manta.jar (находится в mantaray.zip) в php.ini свойство «java.class.property»
- Запустить примеры (char.php для топиков, queue_receiver.php и queue_sender.php для очередей).
API отправки сообщений PHPMQ включает следующие функции:
- enqueue: отправляет сообщение в очередь с именем $queueName (string); $userId (string) является идентификатором в шине сообщений.
enqueue($userId, $queueName, $message)
- dequeue: возвращает текстовое сообщение из очереди $queueName (string); $userId (string) является идентификатором в шине сообщений.
dequeue($userId, $queueName)
- getQueues: возвращает список очередей, которые доступны в шине сообщений.
array getQueues()
- getTopics: возвращает список топиков, которые доступны в шине сообщений.
array getTopics()
- subscribe: добавляет слушателя к топику $topicName (string), который получит не более, чем $messagesToCash (number) сообщений; $userId (string) является идентификатором в шине сообщений.
subscribe($userKey $topicName, $messagesToCash)
- publishMessage: публикует сообщение с текстом $msg (string) в топике $topicName (string); $userId (string) является опять же идентификатором в шине сообщений.
publishMessage($userKey, $topicName, $msg)
От переводчика
Увидев эту статью я захотел её перевести. Просмотрел по диагонали и начал перевод. Где-то к середине уже понял, что материал не дотягивает полностью до уровня хабра. Тем более присутствуют несвязанные и перегруженные предложения. Надеюсь, что это не причина для неопубликования данного материала.
Как обычно, обо всех неточностях прошу сообщать в хабр-почту.
Автор: wapmorgan