- Семафоры
- Gearman
- JMS с PHP:
- QUERCUS
- 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 двумя способами:
- Используя чистую 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
С помощью Resin Web-Server (
Для использования 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 нужно:
- Разархивировать quercus-4.0.39.war (http://ift.tt/K6ASC8) и скопировать 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://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.
- В основном проекте, «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 — подробнее на 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.
Комментариев нет:
Отправить комментарий