rstmpw/ibmmq

PHP client for IBM WebSphere MQ


Keywords
MQ, ibm, mqseries, websphere
License
MIT

Documentation

IBM MQ - PHP Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для взаимодСйствия с IBM WebSphere MQ

Установка

Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ для PHP7 pecl Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ mqseries.

composer require rstmpw/ibmmq

ИспользованиС

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π±Ρ€Π°ΡΡ‹Π²Π°Ρ‚ΡŒ \RuntimeException ΠΈΠ»ΠΈ \InvalidArgumentException

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅/ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

// Ѐункция-ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ для формирования ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ структуры ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.
// Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ внСшнСС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Ρ‚ΠΎ Ρ‚Π°ΠΌ слСдуСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡƒΠΆΠ΅
// ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ структуру.
$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');

// БоСдиняСмся с сСрвСром
$mqServer = new MQClient($mqConnOpts);

// ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ
$mqQueue = $mqServer->openQueue('QUEUE.NAME');
// Для ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Ρ… ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ:
// $mqOueue = $mqServer->openQueue('REMOTE.QUEUE.NAME', [MQSERIES_MQOO_FAIL_IF_QUIESCING, MQSERIES_MQOO_OUTPUT]);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сообщСниС ΠΈ отправляСм Π΅Π³ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ
$outMessage = new MQMessage('Somebody message '.time());
echo "\n Data: ".$outMessage->data();
$mqQueue->put($outMessage);
echo "\n msgId: ".$outMessage->property('MsgId');

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ
$inMessage = $mqQueue->get();
echo "\n Data: ".$inMessage->data();
echo "\n msgId: ".$inMessage->property('MsgId');

// Π—Π°ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈ соСдинСниС с сСрвром
// Π―Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ, дСструкторы ΡΠ΄Π΅Π»Π°ΡŽΡ‚ всС автоматичСски
$mqQueue->close();
unset($mqServer);

Если Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ сообщСниС, Ρ‚ΠΎ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ ΠΌΠΎΠΆΠ½ΠΎ явно Π½Π΅ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ put1()

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сообщСниС
$outMessage = new MQMessage('Somebody message '.time());

$mqServer->put1($outMessage, 'QUEUE.NAME');
echo "\n msgId: ".$outMessage->property('MsgId');

ΠžΡ‚ΠΏΡ€Π°Π²ΠΊΠ° сообщСний Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Π½Π΅ΠΆΠ΄Π΅Ρ€ ΠΎΡ‡Π΅Ρ€Π΅Π΄Π΅ΠΉ

Π’Π°Ρˆ QM Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ сообщСния Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ (Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ ΡƒΠ΄Π°Π»Π΅Π½Π½ΡƒΡŽ ΠΈΠ»ΠΈ Ρ‚Ρ€Π°Π½ΡΠΏΠΎΡ€Ρ‚Π½ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ)

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сообщСниС
$outMessage = new MQMessage('Somebody message '.time());

$mqServer->put1($outMessage, 'QM.REMOT//QUEUE.NAME');
echo "\n msgId: ".$outMessage->property('MsgId');

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ сообщСний ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ с ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΠ΅ΠΌ ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ ΠΏΠΎ CorrelId

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

$mqQueue = $mqServer->openQueue('QUEUE.NAME');

// УстанавливаСм ΠΎΠΏΡ†ΠΈΠΈ получСния сообщСния ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ
$getOpts = [
    'Version' => MQSERIES_MQGMO_VERSION_2,
    'Options' => [MQSERIES_MQGMO_FAIL_IF_QUIESCING, MQSERIES_MQGMO_WAIT],
    'WaitInterval' => 60*1000, //60 sec
    'MatchOptions' => [MQSERIES_MQMO_MATCH_CORREL_ID]
];
$MQMD = [
    'MsgId' => MQSERIES_MQMI_NONE,
    'CorrelId' => 'NeedCorrelId'
];

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ
$inMessage = $mqQueue->get($getOpts, $MQMD);
echo "\n Data: ".$inMessage->data();
echo "\n msgId: ".$inMessage->property('MsgId');
echo "\n correlId: ".$inMessage->property('CorrelId');

$mqQueue->close();
unset($mqServer);

Π—Π°ΠΏΠΈΡΡŒ/Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ свойств сообщСний

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сообщСниС ΠΈ устнавливаСм свойства
$outMessage = new MQMessage('Somebody message '.time());
$outMessage->property('Priority', 7);
$outMessage->property('ReplyToQ', 'RESPONSE.QUEUE');
$outMessage->property('ReplyToQMgr', 'RESPONSE.QM');

// ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ сообщСниС
$mqServer->put1($outMessage, 'QUEUE.NAME');

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС ΠΈ смотрим свойства
$mqQueue = $mqServer->openQueue('QUEUE.NAME');
$inMessage = $mqQueue->get();
echo "\n Data: ".$inMessage->data();
echo "\n msgId: ".$inMessage->property('MsgId');
echo "\n Priority: ".$inMessage->property('Priority');
echo "\n ReplyToQ: ".$inMessage->property('ReplyToQ');
echo "\n ReplyToQMgr: ".$inMessage->property('ReplyToQMgr');

ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡ Ρ‚ΠΎΠΏΠΈΠΊΠΎΠ²

ΠŸΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΠΏΠΎΡ…ΠΎΠΆΠ° Π½Π° ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΡƒ сообщСния, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ вмСсто ΠΈΠΌΠ΅Π½ΠΈ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ имя Ρ‚ΠΎΠΏΠΈΠΊΠ° ΠΈ ΠΈΠ· Ρ‚ΠΎΠΏΠΈΠΊΠ° нСльзя Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ сообщСния. Имя Ρ‚ΠΎΠΏΠΈΠΊΠ° прСдствдяСт собой строку Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ '/', Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 'news/sport/nascar'.

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

// ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Ρ‚ΠΎΠΏΠΈΠΊ
$mqQueue = $mqServer->openTopic('news/sport/nascar');

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сообщСниС ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² Ρ‚ΠΎΠΏΠΈΠΊ
$outMessage = new MQMessage('Latest news about nascar racing');
$mqQueue->put($outMessage);

Π’Π°ΠΊΠΆΠ΅ поддСрТиваСтся сокращСнный Π²Ρ‹Π·ΠΎΠ² Ρ‡Π΅Ρ€Π΅Π· put1, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ имя Ρ‚ΠΎΠΏΠΈΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с 'TOPIC::'

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

// Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ сообщСниС ΠΈ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ΅ΠΌ Π΅Π³ΠΎ Π² Ρ‚ΠΎΠΏΠΈΠΊ
$outMessage = new MQMessage('Latest news about nascar racing');
$mqServer->put1($outMessage, 'TOPIC::news/sport/nascar/winners/top/1');

Π’Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ

Π Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ транзакциям Π² Π‘Π£Π‘Π”

<?php
use rstmpw\ibmmq\MQClient;
use rstmpw\ibmmq\MQMessage;

$mqConnOpts = MQClient::makeConnOpts('QM.NAME', '172.18.0.7', '1414');
$mqServer = new MQClient($mqConnOpts);

// ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ 2 сообщСния Π²Π½Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ
$outMessage = new MQMessage('Put message w/o transaction');
$mqServer->put1($outMessage, 'OTHER.QUEUE.NAME');
$mqServer->put1($outMessage, 'OTHER.QUEUE.NAME');

// ΠžΡ‚ΠΊΡ€Ρ‹Π²Π΅ΠΌ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ
$mqServer->begin();

// ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ сообщСниС ΠΈΠ· ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ OTHER.QUEUE.NAME
$mqQueue = $mqServer->openQueue('OTHER.QUEUE.NAME');
$mqQueue->get();

// ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ сообщСниС Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ QUEUE.NAME с использованиСм put1
$mqServer->put1(new MQMessage('MSG1'), 'QUEUE.NAME');

// ΠžΡ‚ΠΏΡ€Π°Π²Π»ΡΠ΅ΠΌ Π΅Ρ‰Π΅ 2 сообщСния Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ QUEUE.NAME ΠΈ ΠΎΠ΄Π½ΠΎ ΠΎΡ‚Ρ‚ΡƒΠ΄Π° Π·Π°Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‡Π΅Ρ€Π΅Π· явноС ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ
$mqQueueOut = $mqServer->openQueue('QUEUE.NAME');
$mqQueueOut->put(new MQMessage('MSG2'));
$mqQueueOut->put(new MQMessage('MSG2'));
$mqQueueOut->get();

// ЀиксируСм Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ
$mqServer->commit();
// Если ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π΄ запуском скрипта ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ Π±Ρ‹Π»ΠΈ ΠΏΡƒΡ‚Ρ‹Π΅, Ρ‚ΠΎ Π² ΠΈΡ‚ΠΎΠ³Π΅ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ OTHER.QUEUE.NAME Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ΄Π½ΠΎ сообщСниС,
// a Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ QUEUE.NAME - 2 сообщСния.
// Если явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΡŽ
// $mqServer->rollback();
// ΠΈΠ»ΠΈ явно Π΅Π΅ Π½Π΅ Π·Π°ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΈΡ‚ΡŒ, Ρ‚ΠΎ Π² ΠΎΡ‡Π΅Ρ€Π΅Π΄ΠΈ OTHER.QUEUE.NAME Π±ΡƒΠ΄Π΅Ρ‚ 2 сообщСния, Π° QUEUE.NAME останСтся пустой.

Зависимости

  • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с PHP 7.0 ΠΈ Π²Ρ‹ΡˆΠ΅.
  • Для Ρ€Π°Π±ΠΎΡ‚Ρ‹ трСбуСтся Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ΅ pecl Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ mqseries.