Pull to refresh

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

Reading time 8 min
Views 13K
Original author: Octavia Andreea Anghel
Узнаем больше о тонкостях основных сервисов передачи сообщений, доступных в PHP.

  1. Семафоры
  2. Gearman
  3. JMS с PHP через QUERCUS
  4. 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 двумя способами:
  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

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 вы должны выполнить следующие шаги:
  1. Распаковать Quercus-4.0.39.war (http://quercus.caucho.com/) и скопировать JAR-файлы в каталоге «WEB-INF/lib» в «GLASSFISH_HOME/domains/domain/lib».
    Скрытый текст
  2. Создайте новый проект веб-приложения, «PHPexample», используя IDE NetBeans и выберите GlassFish в качестве сервера:
    Скрытый текст
    Скрытый текст
    Скрытый текст
    После нажатия кнопки Готово, папка со следующей структурой будет создана:
    Скрытый текст

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

    Таким образом мы объявили сервлет из PHP.
  4. В главном проекте, PHPexample создайте файл PHP с именем index.php с контекстом:
    index.php
    index.php
    <?php
    echo "Привет мир!";
    phpinfo();
    ?>

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

    Обратите внимание, что «index.jsp» только файл шаблона для начала работы с JSP, и он не имеет отношения к нашим задачам.
  5. Запустите приложение 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)


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

После начала перевода оказалось, что материал немного не дотягивает до уровня хабра. Надеюсь, это не помешает кому-либо получить пользу от данного материала.
Как обычно, обо всех неточностях прошу сообщать в хабр-почту.
Tags:
Hubs:
+2
Comments 2
Comments Comments 2

Articles