...

пятница, 4 июля 2014 г.

[Перевод] Знакомство с сервисами передачи сообщений PHP

Изучим все детали основных сервисов передачи сообщений доступных в PHP.

  1. Семафоры

  2. Gearman

  3. JMS с PHP:


    1. QUERCUS

    2. 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 ] )

    Возвращает 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 двумя способами:



  1. Используя чистую PHP обертку, названную Net_Gearman, с помощью pear install Net_Gearman.

  2. Специализированное 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



С помощью Resin Web-Server ( ), Quercus является частью Resin Application Server и встроен в Resin — таким образом нет никакой необходимости в дополнительные установках. Для установка Resin на Windows, проследуйте шагам из http://ift.tt/1rsuGJp. Для проверки установки resin посетите localhost:8080 в браузере.

Для использования JMS в Quercus, сконфигурирейте JMS для PHP и JAVA, для этого вам нужно установить ConnectionFactory и Queue, оба находятся в файле resin-web.xml в каталоге WEB-INF.



resin-web.xml



<web-app xmlns="http://ift.tt/KSmfEZ"
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 нужно:


  1. Разархивировать quercus-4.0.39.war (http://ift.tt/K6ASC8) и скопировать jar-файлы из «WEB-INF/lib» в другой каталог «GLASSFISH_HOME/domains/domain/lib».


  2. Создать новый проект веб-приложения — «PHPexample» в NetBeans IDE и выбрать GlassFish в качестве сервера:







    Структура директорий после нажатия на Finish.


  3. В каталоге WEB-INF создайте файл web.xml (если он не был создан ранее): File > New > Empty. Вставьте в него следующий текст и сохраните:

    web.xml
    web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://ift.tt/nSRXKP"
    xmlns:xsi="http://ift.tt/ra1lAU"
    xsi:schemaLocation="http://ift.tt/nSRXKP http://ift.tt/LU8AHS"
    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.

  4. В основном проекте, «PHPexample», создайте PHP файл, назовите его index.php, заполните этим:

    index.php
    index.php

    <?php
    echo "Hello World!";
    phpinfo();
    ?>





    Эта страница печатает «Hello World!» в браузер и некоторую конфигуацию PHP.Структура директорий должна выглядеть следующим образом:


    Обратите внимание, что «index.jsp» всего лишь файл-шаблон для начала работа с JSP, is only a template file to get started with JSPs, но не относится к этому тесту.



  5. Запустите 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.


Процесс установки PHPMQ:


  • Скачать и установить шину сообщений MantaRay

  • Настроить MantaRay: включить RMI интерфейс и создать RMI регистр (подробнее в документации RMI API проекта mantaray).

  • Запустить mantaray как автономное приложение

  • Включить php-java расширение в php.ini — подробнее на http://ift.tt/1rsuGJE

  • Добавить 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)


От переводчика



Увидев эту статью я захотел её перевести. Просмотрел по диагонали и начал перевод. Где-то к середине уже понял, что материал не дотягивает полностью до уровня хабра. Тем более присутствуют несвязанные и перегруженные предложения. Надеюсь, что это не причина для неопубликования данного материала.

Как обычно, обо всех неточностях прошу сообщать в хабр-почту.

This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at http://ift.tt/jcXqJW.


Комментариев нет:

Отправить комментарий