Узнаем больше о тонкостях основных сервисов передачи сообщений, доступных в PHP.
Semaphore представляет собой модуль PHP, который фактически состоит из трех расширений, которые включает семафоры, разделяемую память и межпроцессный обмен сообщениями (IPC). Этот модуль предоставляет оболочки для семейства System V IPC функций и чтобы использовать его в PHP, вам необходимо включить его, потому что он не является включенным по умолчанию, поэтому для включения поддержки System V семафоров PHP используйте опцию
*Примечание: Модуль Semaphore не доступен на платформах Windows.
Для использования модуля межпроцессного взаимодействия (IPC) имеется набор функций, перечисленных далее:
Gearman — это каркас приложений и предназначен он для работы с несколькими процессами и позволяет программам выполнять задачи в параллельном режиме и вызывать функции между языками. Gearman может использоваться в различных приложениях: от веб-сайтов с высокой доступностью до передачи событий репликации базы данных, и состоит из двух основных компонентов: сервер заданий и клиент/воркер API. Клиент и воркер API может быть использован в широком множестве языков, но сервер заданий доступен только в качестве библиотеки C или библиотеки Perl. Этот факт затрудняет возможность запуска сервера на Windows, в основном из-за неразрешенной зависимости от других библиотек.
Вы можете установить платформу приложения Gearman двумя способами:
Как вы, наверное, знаете, большинство особенностей JMS предназначены для служб управляемых сообщениями, которые в мире Java очень подходят, но не подходят для PHP. Для того чтобы использовать эти функции в PHP, необходимо реализовать Java с использованием различных технологий, в данном случае, Quercus.
Java Message Service (JMS) является стандартом обмена сообщениями, который позволяет компонентам приложения, основанные на Java Enterprise Edition (Java EE) создавать, отправлять, получать и читать сообщения. Обмен данными может осуществляться асинхронный (поставщик JMS может доставлять сообщения клиенту по мере их поступления; клиенты не должны запрашивать сообщения для того, чтобы получать их) или достоверный (JMS API может гарантировать, что сообщение будет доставлено сразу и только раз. Более низкие уровни надежности доступны для приложений, которые могут позволить себе пропустить сообщения или получать дубликаты сообщений).
Quercus является 100% реализацией PHP 5 в рамках Java Caucho Technology, выпущен под лицензией Open Source GPL. Quercus поставляется с большим количеством модулей PHP и расширений, таких как PDF, PDO, MySQL и JSON, и обеспечивает тесную интеграции служб Java со сценариями PHP, так что использование PHP с JMS очень удобно. Quercus также предлагает удобный интерфейс обмена сообщениями с использованием службы сообщений Java, так что это дает возможность отправлять и получать сообщения с помощью реализации Resin JMS или любой другой службы обмена сообщениями, реализующей JMS, как вы увидите далее в этом разделе. Для установки и использования Quercus у вас есть два варианта:
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
Программная модель интерфейса Quercus предполагает интерфейс получения доступ к очереди используя вызов java_bean(), который найдет именованный объект в файле resin-web.xml, в данном случае это очередь. Именно потому, что Queue реализует интерфейс java.util.concurrent.BlockingQueue, PHP скрипт имеет возможность немедленно отправлять данные в очередь с помощью offer() и получать их с помощью poll().
Сценарий проверяет POST переменную «message» и если она установлена, посылает значение этой переменной в очередь JMS. Объект, управляемый сообщениями (MDB) получает эти сообщения и записывает их. Запись отображается сервлетом.
Вторым способом использования Quercus является использование IDE NetBeans и GlassFish в качестве сервера. Для использования Quercus в NetBeans вы должны выполнить следующие шаги:
PHPMQ является пиринговым набором инструментов обмена сообщениями с открытым исходным кодом для PHP, давая разработчику PHP способность выполнять операции JMS, такие как отправка и получение сообщений по очередями и темам, обеспечивая при этом доставку и обеспечивает постоянную передачу сообщений. Это открывает новые возможности для PHP-разработчиков, которые теперь могут получить доступ к данным так называемого бэк-офиса, которые, как правило, доступны только серверам приложений и старым решениям в области передачи сообщений.
PHPMQ () Mantaray () является распределенной, пиринговой, бессерверной системой для решения задачи обмена сообщениями для Java (JMS), C++ и .NET приложений, интегрируется с JBoss, WebLogic и WebSphere. Он предлагает гарантированную доставку, безопасности и транзакций и поддерживает TCP, SSL и HTTP протоколы.
Установка PHPMQ:
→ Загрузите и установите шину обмена сообщениями MantaRay
→ Настройте MantaRay для включения API RMI и создания реестра RMI (См. документацию API RMI на 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.path» свойство
→ Запустите примеры (chat.php для тем и queue_receiver.php, queue_sender.php для очередей)
API обмена сообщениями PHPMQ включает в себя следующие функции:
После начала перевода оказалось, что материал немного не дотягивает до уровня хабра. Надеюсь, это не помешает кому-либо получить пользу от данного материала.
Как обычно, обо всех неточностях прошу сообщать в хабр-почту.
- Семафоры
- Gearman
- JMS с PHP через QUERCUS
- JMS с PHP через PHPMQ->MANTARAY
1. Семафоры
Semaphore представляет собой модуль PHP, который фактически состоит из трех расширений, которые включает семафоры, разделяемую память и межпроцессный обмен сообщениями (IPC). Этот модуль предоставляет оболочки для семейства System V IPC функций и чтобы использовать его в PHP, вам необходимо включить его, потому что он не является включенным по умолчанию, поэтому для включения поддержки System V семафоров PHP используйте опцию
--enable-sysvsem
; чтобы включить поддержку разделяемой памяти System V скомпилируйте PHP используя опцию --enable-sysvshm
; и для того, чтобы включить поддержку сообщений System V скомпилируйте PHP используя опцию --enable-sysvmsg
.*Примечание: Модуль Semaphore не доступен на платформах Windows.
Для использования модуля межпроцессного взаимодействия (IPC) имеется набор функций, перечисленных далее:
- msg_get_queue: Создать или присоединиться к очереди сообщений.
resource msg_get_queue ( int $key [, int $perms = 0666 ] )
Возвращает идентификатор, который может использоваться для доступа к 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 (который должен быть больше 0) в очередь сообщений, указанную в queue. - msg_set_queue: Установить информацию в структуру данных очереди сообщений.
bool msg_set_queue ( resource $queue , array $data )
Позволяет изменять значения msg_perm.uid, msg_perm.gid, msg_perm.mode и msg_qbytes областях основной структуры данных очереди сообщений. - msg_stat_queue: Возвращает информацию из структуры данных очереди сообщений.
array msg_stat_queue ( resource $queue )
Возвращает метаданные для очереди сообщений, указанной в queue
2. Gearman
Gearman — это каркас приложений и предназначен он для работы с несколькими процессами и позволяет программам выполнять задачи в параллельном режиме и вызывать функции между языками. Gearman может использоваться в различных приложениях: от веб-сайтов с высокой доступностью до передачи событий репликации базы данных, и состоит из двух основных компонентов: сервер заданий и клиент/воркер API. Клиент и воркер API может быть использован в широком множестве языков, но сервер заданий доступен только в качестве библиотеки C или библиотеки Perl. Этот факт затрудняет возможность запуска сервера на Windows, в основном из-за неразрешенной зависимости от других библиотек.
Вы можете установить платформу приложения Gearman двумя способами:
- Используя чистую PHP обертку, названную Net_Gearman, с помощью
pear install Net_Gearman
. - Специализированное PHP расширение. []. Это расширение предлагает ООП-интерфейс для написания Gearman-клиентов и воркеров.
3. JMS с PHP через Quercus
Как вы, наверное, знаете, большинство особенностей JMS предназначены для служб управляемых сообщениями, которые в мире Java очень подходят, но не подходят для PHP. Для того чтобы использовать эти функции в PHP, необходимо реализовать Java с использованием различных технологий, в данном случае, Quercus.
Java Message Service (JMS) является стандартом обмена сообщениями, который позволяет компонентам приложения, основанные на Java Enterprise Edition (Java EE) создавать, отправлять, получать и читать сообщения. Обмен данными может осуществляться асинхронный (поставщик JMS может доставлять сообщения клиенту по мере их поступления; клиенты не должны запрашивать сообщения для того, чтобы получать их) или достоверный (JMS API может гарантировать, что сообщение будет доставлено сразу и только раз. Более низкие уровни надежности доступны для приложений, которые могут позволить себе пропустить сообщения или получать дубликаты сообщений).
Quercus является 100% реализацией PHP 5 в рамках Java Caucho Technology, выпущен под лицензией Open Source GPL. Quercus поставляется с большим количеством модулей PHP и расширений, таких как PDF, PDO, MySQL и JSON, и обеспечивает тесную интеграции служб Java со сценариями PHP, так что использование PHP с JMS очень удобно. Quercus также предлагает удобный интерфейс обмена сообщениями с использованием службы сообщений Java, так что это дает возможность отправлять и получать сообщения с помощью реализации Resin JMS или любой другой службы обмена сообщениями, реализующей JMS, как вы увидите далее в этом разделе. Для установки и использования Quercus у вас есть два варианта:
Resin Web-server
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» и если она установлена, посылает значение этой переменной в очередь JMS. Объект, управляемый сообщениями (MDB) получает эти сообщения и записывает их. Запись отображается сервлетом.
NetBeans IDE и GlassFish
Вторым способом использования Quercus является использование IDE NetBeans и GlassFish в качестве сервера. Для использования Quercus в NetBeans вы должны выполнить следующие шаги:
- Распаковать Quercus-4.0.39.war (http://quercus.caucho.com/) и скопировать JAR-файлы в каталоге «WEB-INF/lib» в «GLASSFISH_HOME/domains/domain/lib».
Скрытый текст - Создайте новый проект веб-приложения, «PHPexample», используя IDE NetBeans и выберите GlassFish в качестве сервера:
Скрытый текстСкрытый текстСкрытый текстПосле нажатия кнопки Готово, папка со следующей структурой будет создана:
Скрытый текст
- В каталоге WEB-INF создайте файл web.xml (если он не был создан ранее): File > New > Empty. Вставьте в него следующий текст и сохраните:
web.xmlТаким образом мы объявили сервлет из PHP.web.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>
- В главном проекте, PHPexample создайте файл PHP с именем index.php с контекстом:
index.phpindex.php
<?php echo "Привет мир!"; phpinfo(); ?>
Эта страница печатает «Привет мир!» в браузере и некоторые параметры конфигурации РНР. Структура каталогов созданного проекта выглядит следующим образом:
Скрытый текст
Обратите внимание, что «index.jsp» только файл шаблона для начала работы с JSP, и он не имеет отношения к нашим задачам.
- Запустите приложение PHP в GlassFish на localhost:8080/PHPexample/index.php/ и вы должны получить вывод ниже:
Скрытый текст
Как только вы увидели, что Quercus работает в среде IDE NetBeans и GlassFish в качестве сервера, вы можете попробовать использовать все возможности JMS и все другие расширения, которые поставляются с Quercus.
4. JMS с PHP через PHPMQ
PHPMQ является пиринговым набором инструментов обмена сообщениями с открытым исходным кодом для PHP, давая разработчику PHP способность выполнять операции JMS, такие как отправка и получение сообщений по очередями и темам, обеспечивая при этом доставку и обеспечивает постоянную передачу сообщений. Это открывает новые возможности для PHP-разработчиков, которые теперь могут получить доступ к данным так называемого бэк-офиса, которые, как правило, доступны только серверам приложений и старым решениям в области передачи сообщений.
PHPMQ () Mantaray () является распределенной, пиринговой, бессерверной системой для решения задачи обмена сообщениями для Java (JMS), C++ и .NET приложений, интегрируется с JBoss, WebLogic и WebSphere. Он предлагает гарантированную доставку, безопасности и транзакций и поддерживает TCP, SSL и HTTP протоколы.
Установка PHPMQ:
→ Загрузите и установите шину обмена сообщениями MantaRay
→ Настройте MantaRay для включения API RMI и создания реестра RMI (См. документацию API RMI на 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.path» свойство
→ Запустите примеры (chat.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)
От переводчика
После начала перевода оказалось, что материал немного не дотягивает до уровня хабра. Надеюсь, это не помешает кому-либо получить пользу от данного материала.
Как обычно, обо всех неточностях прошу сообщать в хабр-почту.