2011-10-28 18 views
8

Así que he pasado los últimos días tratando de resolver esto que parece haberse olvidado ya que ninguna de las dos extensiones PECL disponibles (SAM y mqseries) se han actualizado durante mucho tiempo. He intentado ambos y mqseries parece que me lleva más lejos en este punto, ya que SAM se niega a hacerme una conexión, a pesar de que MQ funciona perfectamente desde la línea de comandos. He creado con éxito una conexión con mi gestor_colas y es durante el siguiente paso (MQOPEN) que fallan miserablemente:Intentando conectar a MQ usando PHP; casi allí

$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); 

Esto se traduce en $ razón de ser poblado con 2044, que se traduce en MQRC_OD_ERROR, o en Inglés: 'En la llamada MQOPEN o MQPUT1, el descriptor de objeto MQOD no es válido'.

Entonces la pregunta es, ¿qué pasa con mi MQOD?

Actualización n. ° 1: En este punto, esto no se resuelve. Reconstruí el proyecto desde cero para resolver cualquier problema en tiempo de compilación. Todavía estoy atascado en MQOPEN que devuelve 2044. Las muestras aún se ejecutan perfectamente desde CLI, por lo que esto definitivamente está relacionado con la instalación de la extensión PECL. Si hay alguien por ahí que ha instalado con éxito y está ejecutando PHP contra MQ en un entorno PHP5 de 64 bits bastante reciente, por favor hágamelo saber ...

Actualización n. ° 2: MQPUT1 funciona perfectamente con el problema de que no puedo recibir mi respuesta. En este punto, es solo MQOPEN que no funciona. La pregunta es; ¿Qué está causando que MQOPEN devuelva 2044 cuando funciona MQPUT1, lo que entiendo incluye MQOPEN?

+0

* He creado con éxito una conexión a mi QueueManager y es durante el siguiente paso (MQCONN) que fallo miserablemente ... * ¿Por casualidad quiere decir que está en el MQOpen que falla? –

+1

Sí, lo siento. He editado mi pregunta. – eriben

+0

No estoy familiarizado con los módulos de PHP pero 'DeviceName' parece una clave impar para el nombre de la cola. –

Respuesta

1

El MQOD en el archivo cmqch se ve así:

/****************************************************************/ 
/* 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 

Me pregunto si el módulo rellena los valores por defecto y está dejando que se reemplaza luego con el hash. Si es así, ¿DeviceName es realmente la clave correcta? Creo que coincidiría con el nombre de campo WMQ o la constante.

Actualización: Por the example en el enlace proporcionado, la clave hash coincide de hecho con el nombre del campo de cmqc.h.

Actualización # 2 responden a comentar: Los tipos de objetos definidos en cmqc.h son:

/* 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 

Mi comprensión del PHP, Perl y la mayoría de los otros esfuerzos similares es que son un envoltorio muy delgada sobre la C API. El Perl simplemente genera la mayor parte del código directamente desde el cmqc.h y otros archivos de inclusión de C y, por lo tanto, todos los nombres de campo y valores predeterminados coinciden exactamente con esos archivos de inclusión. Este módulo parece haber adoptado un enfoque similar y espero usar los nombres definidos y los valores predeterminados de campo cuando sea necesario.

Estoy pensando en algo como:

$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 
); 

Actualización # 3 responder a los comentarios adicionales:

El Q Mons aceptará cualquier versión del MQOD pero caerá de nuevo a ese nivel de funcionalidad. Si usas v1, puedes probar que funciona. Si desea utilizar versiones posteriores de MQOD, deberá agregar los campos adicionales al hash.

El 2009 es "Conexión interrumpida". Básicamente, al QMgr no le gustó nada y terminó su conexión. Por lo general, los mensajes de error significativos para ese código de retorno están en /var/mqm/qmgrs/<qmgrname>/errors/AMQEER01.LOG.

+0

lo hacen. Se cambió la tabla hash a la siguiente en vano: $ mqods = array ('ObjectName' => 'MYPUTQUEUE', 'ObjectType' => MQOT_Q, 'ObjectQMgrName' => 'MYQUEUEMANAGER'); – eriben

+0

A menos que se defina la constante MQOT_Q, ese valor sería un 1. –

+0

Al cambiar la Versión a 4, se produjo otro error; 2009, que al menos significa que acepta el MQOD. 4 significa 'Versión actual' si leo cmqc.h correctamente – eriben

Cuestiones relacionadas