2011-10-28 11 views
8

Quindi ho passato gli ultimi giorni a cercare di risolvere ciò che sembra essere stato dimenticato poiché nessuna delle due estensioni PECL disponibili (SAM e mqseries) è stata aggiornata per un lungo periodo. Ho provato entrambi e mqseries mi sembra il più lontano a questo punto dal momento che SAM si rifiuta di ottenere una connessione, anche se MQ funziona perfettamente dalla riga di comando. Ho creato con successo un collegamento al mio QueueManager ed è durante la prossima fase (MQOPEN) che non riesco miseramente:Cercando di connettersi a MQ usando PHP; quasi lì

$mqcno = array(
     'Version' => MQSERIES_MQCNO_VERSION_2, 
     'Options' => MQSERIES_MQCNO_STANDARD_BINDING, 
     'MQCD' => array('ChannelName' => '[channel]', 
     'ConnectionName' => '[ipnumber]([port])', 
     'TransportType' => MQSERIES_MQXPT_TCP) 
    ); 

mqseries_connx('MQED', $mqcno, $conn, $comp_code,$reason); 
if ($comp_code !== MQSERIES_MQCC_OK) { 
    printf("Connx CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, $reason); 
    exit; 
} 

$mqods = array('ObjectName'=>'MYPUTQUEUE', 'ObjectType'=>MQOT_Q, 'ObjectQMgrName'=>'MYQUEUEMANAGER'); 
mqseries_open($conn, $mqods, 
      MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT, 
      $obj, $comp_code,$reason); 

questo si traduce in $ motivo è popolato con 2044, che si traduce in MQRC_OD_ERROR, o in inglese: 'Sulla chiamata MQOPEN o MQPUT1, il descrittore dell'oggetto MQOD non è valido'.

Quindi la domanda è: cosa c'è che non va nel mio MQOD?

Aggiornamento n. 1: A questo punto questo non viene risolto. Ho ricostruito il progetto da zero per risolvere eventuali problemi al momento della compilazione. Sono ancora bloccato su MQOPEN che restituisce 2044. I campioni continuano a funzionare perfettamente da CLI, quindi questo è sicuramente legato all'installazione dell'estensione PECL. Se c'è qualcuno là fuori che ha installato con successo e sta eseguendo PHP contro MQ in un ambiente PHP5 a 64 bit abbastanza recente, per favore fatemi sapere ...

Update # 2: MQPUT1 funziona perfettamente con il problema che non posso ricevere la mia risposta A questo punto, è solo MQOPEN che non funziona. La domanda è; cosa sta causando MQOPEN a restituire 2044 quando MQPUT1 funziona, cosa che comprende MQOPEN?

+0

* Ho creato con successo una connessione al mio QueueManager ed è durante il passaggio successivo (MQCONN) che non riesco a fallire miseramente ... * Si intende per certo che è su MQOpen che non riesce? –

+1

Sì, mi dispiace. Ho modificato la mia domanda. – eriben

+0

Non ho familiarità con i moduli PHP ma 'DeviceName' sembra una chiave dispari per il nome della coda. –

risposta

1

Il MQOD nel file cmqch assomiglia a questo:

/****************************************************************/ 
/* MQOD Structure -- Object Descriptor       */ 
/****************************************************************/ 


typedef struct tagMQOD MQOD; 
typedef MQOD MQPOINTER PMQOD; 
typedef PMQOD MQPOINTER PPMQOD; 

struct tagMQOD { 
    MQCHAR4 StrucId;    /* Structure identifier */ 
    MQLONG Version;    /* Structure version number */ 
    MQLONG ObjectType;   /* Object type */ 
    MQCHAR48 ObjectName;   /* Object name */ 
    MQCHAR48 ObjectQMgrName;  /* Object queue manager name */ 
    MQCHAR48 DynamicQName;   /* Dynamic queue name */ 
    MQCHAR12 AlternateUserId;  /* Alternate user identifier */ 
    /* Ver:1 */ 
    MQLONG RecsPresent;   /* Number of object records 
             present */ 
    MQLONG KnownDestCount;  /* Number of local queues opened 
             successfully */ 
    MQLONG UnknownDestCount;  /* Number of remote queues opened 
             successfully */ 
    MQLONG InvalidDestCount;  /* Number of queues that failed to 
             open */ 
    MQLONG ObjectRecOffset;  /* Offset of first object record 
             from start of MQOD */ 
    MQLONG ResponseRecOffset; /* Offset of first response record 
             from start of MQOD */ 
    MQPTR  ObjectRecPtr;   /* Address of first object record */ 
    MQPTR  ResponseRecPtr;  /* Address of first response 
             record */ 
    /* Ver:2 */ 
    MQBYTE40 AlternateSecurityId; /* Alternate security identifier */ 
    MQCHAR48 ResolvedQName;  /* Resolved queue name */ 
    MQCHAR48 ResolvedQMgrName;  /* Resolved queue manager name */ 
    /* Ver:3 */ 
    MQCHARV ObjectString;   /* Object long name */ 
    MQCHARV SelectionString;  /* Message Selector */ 
    MQCHARV ResObjectString;  /* Resolved long object name*/ 
    MQLONG ResolvedType;   /* Alias queue resolved object type */ 
    /* Ver:4 */ 
}; 

#define MQOD_DEFAULT {MQOD_STRUC_ID_ARRAY},\ 
         MQOD_VERSION_1,\ 
         MQOT_Q,\ 
         {""},\ 
         {""},\ 
         {"AMQ.*"},\ 
         {""},\ 
         0,\ 
         0,\ 
         0,\ 
         0,\ 
         0,\ 
         0,\ 
         NULL,\ 
         NULL,\ 
         {MQSID_NONE_ARRAY},\ 
         {""},\ 
         {""},\ 
         {MQCHARV_DEFAULT},\ 
         {MQCHARV_DEFAULT},\ 
         {MQCHARV_DEFAULT},\ 
         MQOT_NONE 

Mi chiedo se il modulo riempie le impostazioni predefinite e sta lasciando si sostituisce poi con l'hash. In tal caso, "DeviceName" è davvero la chiave giusta? Penserei che corrisponderebbe al nome o alla costante del campo di WMQ.

Aggiornamento: Per the example al collegamento fornito, la chiave di hash corrisponde effettivamente al nome del campo da cmqc.h.

Aggiornamento # 2 rispondono a commentare: tipi oggetto definito cmqc.h sono:

/* Object Types */ 
#define MQOT_NONE  0 
#define MQOT_Q   1 
#define MQOT_NAMELIST 2 
#define MQOT_PROCESS 3 
#define MQOT_STORAGE_CLASS 4 
#define MQOT_Q_MGR  5 
#define MQOT_CHANNEL 6 
#define MQOT_AUTH_INFO 7 
#define MQOT_TOPIC  8 
#define MQOT_CF_STRUC 10 
#define MQOT_LISTENER 11 
#define MQOT_SERVICE 12 
#define MQOT_RESERVED_1 999 

La mia comprensione del PHP, Perl e molti altri sforzi simili è che sono un involucro molto sottile sopra la API C. Il Perl genera semplicemente la maggior parte del codice direttamente da cmqc.h e altri file di inclusione C e quindi tutti i nomi dei campi e i valori di default corrispondono esattamente a quelli inclusi. Sembra che questo modulo abbia adottato un approccio simile e mi sarei aspettato di utilizzare i nomi definiti e le impostazioni predefinite del campo dove necessario.

Sto pensando qualcosa del tipo:

$mqods = array(
       'StrucID'=>'OD ', 
       'Version'=>1. 
       'ObjectType'=>1, 
       'ObjectName'=>'MYPUTQUEUE', 
       'ObjectQMgrName'=>'MYQUEUEMANAGER' 
       'DynamicQName'='', 
       'AlternateUserId'='', 
       'RecsPresent'=>0, 
       'KnownDestCount'=>0, 
       'UnknownDestCount'=>0, 
       'InvalidDestCount'=>0, 
       'ObjectRecOffset'=>0, 
       'ResponseRecOffset'=>0, 
       'ObjectRecPtr'=>NULL, 
       'ResponseRecPtr'=>NULL 
); 

Update # 3 rispondere ai commenti aggiuntivi:

Il Q mons accetteranno qualsiasi versione del MQOD ma cadrà indietro a quel livello di funzionalità. Se utilizzi v1 puoi verificare che funzioni. Se si desidera utilizzare le versioni successive di MQOD, sarà necessario aggiungere i campi aggiuntivi all'hash.

Il 2009 è "Connessione interrotta". In sostanza, a QMgr non è piaciuto qualcosa e la connessione è stata interrotta. Di solito i messaggi di errore significativi per quel codice di ritorno sono in /var/mqm/qmgrs/<qmgrname>/errors/AMQEER01.LOG.

+0

loro fanno. Modificata la tabella hash al seguente senza alcun risultato: $ mqods = array ('ObjectName' => 'MYPUTQUEUE', 'ObjectType' => MQOT_Q, 'ObjectQMgrName' => 'MYQUEUEMANAGER'); – eriben

+0

A meno che non sia definita la costante MQOT_Q, tale valore sarà 1. –

+0

Modifica della versione 4 a causa di un altro errore; 2009, che almeno significa che accetta l'MQOD. 4 significa 'Versione corrente' se leggo cmqc.h correttamente – eriben

Problemi correlati