2011-10-28 39 views
8

Vì vậy, tôi đã dành vài ngày qua để giải quyết vấn đề này dường như đã bị lãng quên vì không có hai phần mở rộng PECL có sẵn (SAM và mqseries) đã được cập nhật trong một thời gian dài. Tôi đã thử cả hai và mqseries dường như để có được tôi xa nhất tại thời điểm này kể từ khi SAM từ chối để có được cho tôi một kết nối, mặc dù MQ hoạt động hoàn hảo từ dòng lệnh. Tôi đã tạo thành công kết nối đến QueueManager của tôi và nó trong bước tiếp theo (MQOPEN) mà tôi thất bại thảm hại:Đang cố gắng kết nối với MQ bằng cách sử dụng PHP; Gần như có

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

Điều này dẫn đến $ Lý do được dân cư với 2044, trong đó dịch để MQRC_OD_ERROR, hoặc bằng tiếng Anh: 'Trong cuộc gọi MQOPEN hoặc MQPUT1, bộ mô tả đối tượng MQOD không hợp lệ'.

Vì vậy, câu hỏi là, có vấn đề gì với MQOD của tôi?

Cập nhật # 1: Tại thời điểm này, điều này không được giải quyết. Tôi xây dựng lại dự án từ đầu để giải quyết mọi vấn đề tại thời điểm xây dựng. Tôi vẫn còn mắc kẹt trên MQOPEN trở về 2044. Các mẫu vẫn chạy hoàn hảo từ CLI, vì vậy điều này chắc chắn gắn liền với việc cài đặt phần mở rộng PECL. Nếu có ai đó đã cài đặt thành công và đang chạy PHP với MQ trong môi trường PHP5 64 bit gần đây, vui lòng cho tôi biết ...

Cập nhật # 2: MQPUT1 hoạt động hoàn hảo với sự cố tôi không thể nhận được phản hồi của tôi. Tại thời điểm này, nó chỉ là MQOPEN không hoạt động. Câu hỏi là; những gì đang gây ra MQOPEN để trở về năm 2044 khi MQPUT1 hoạt động, mà tôi hiểu bao gồm MQOPEN?

+0

* Tôi đã tạo thành công một kết nối tới QueueManager của tôi và trong bước tiếp theo (MQCONN) mà tôi thất bại thảm hại ... * Bạn có chắc là nó trên MQOpen không? –

+1

Có, xin lỗi. Tôi đã chỉnh sửa câu hỏi của mình. – eriben

+0

Tôi không quen thuộc với các mô-đun PHP nhưng 'DeviceName' có vẻ như là một khóa lẻ cho tên hàng đợi. –

Trả lời

1

Các MQOD trong file cmqch trông như thế này:

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

Tôi tự hỏi nếu module điền vào giá trị mặc định và cho phép bạn ghi đè lên sau đó với các hash. Nếu vậy, 'DeviceName' có thực sự là chìa khóa đúng không? Tôi nghĩ nó sẽ khớp với tên trường hoặc hằng số WMQ.

Cập nhật: Mỗi the example tại liên kết được cung cấp, khóa băm thực sự khớp với tên trường từ cmqc.h.

Update # 2 đáp ứng với bình luận: các loại đối tượng theo quy định tại cmqc.h là:

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

sự hiểu biết của tôi về PHP, Perl và hầu hết những nỗ lực tương tự khác là họ là một wrapper rất mỏng so với API C. Perl chỉ đơn giản là tạo ra hầu hết các mã trực tiếp từ cmqc.h và C khác bao gồm các tập tin và do đó tất cả các tên trường và mặc định chính xác phù hợp với những người bao gồm các tập tin. Mô-đun này dường như đã thực hiện một cách tiếp cận tương tự và tôi hy vọng sẽ sử dụng các tên được xác định và mặc định trường khi cần thiết.

Tôi đang nghĩ đến một cái gì đó như:

$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 đáp ứng với ý kiến ​​bổ sung:

Q Mgr sẽ chấp nhận bất kỳ phiên bản của MQOD nhưng sẽ rơi trở lại đến mức đó các chức năng. Nếu bạn sử dụng v1, bạn có thể kiểm tra xem nó có hoạt động không. Nếu bạn muốn sử dụng các phiên bản sau của MQOD thì bạn sẽ cần thêm các trường bổ sung vào băm.

Năm 2009 là "Kết nối bị hỏng". Về cơ bản QMgr không thích cái gì và chấm dứt kết nối của bạn. Thông thường, các thông báo lỗi có ý nghĩa cho mã trả về đó là /var/mqm/qmgrs/<qmgrname>/errors/AMQEER01.LOG.

+0

họ làm. Đã thay đổi bảng băm thành bảng sau thành vô ích: $ mqods = array ('ObjectName' => 'MYPUTQUEUE', 'ObjectType' => MQOT_Q, 'ObjectQMgrName' => 'MYQUEUEMANAGER'); – eriben

+0

Trừ khi MQOT_Q không đổi được xác định, giá trị đó sẽ là 1. –

+0

Thay đổi Phiên bản thành 4 gây ra lỗi khác; 2009, ít nhất có nghĩa là nó chấp nhận MQOD. 4 có nghĩa là 'Phiên bản hiện tại' nếu tôi đọc chính xác cmqc.h – eriben

Các vấn đề liên quan