コード例 #1
0
 public function commit($intLogID, $strQueueName, $strOperation, $arrOperationBody)
 {
     if ($this->_check_conntect()) {
         $sendArray = array();
         $sendArray['__QUEUE_NAME__'] = $strQueueName;
         $sendArray['__OPERATION__'] = $strOperation;
         $sendArray['__OPERATION_BODY__'] = $arrOperationBody;
         $jsonstr = json_encode($sendArray);
         $FORMAT_XHEAD = "Ilogid/a16hiname/Iversion/Ireserved/Idetail_len";
         $binaryData = pack("Ia16III", $intLogID, "ccphp", 0, 0, strlen($jsonstr));
         $binaryData .= $jsonstr;
         //            var_dump(unpack($FORMAT_XHEAD, $binaryData));
         socket_set_option($this->m_sock, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
         socket_set_option($this->m_sock, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 1, "usec" => 0));
         socket_write($this->m_sock, $binaryData);
         $rstr = socket_read($this->m_sock, 32);
         if (32 != strlen($rstr)) {
             $len = strlen($rstr);
             Clogger::warning("socket_read error len: " . $len . " queuename: " . $strQueueName . " operation: " . $strOperation);
             return FALSE;
         }
         $retArray = unpack($FORMAT_XHEAD, $rstr);
         Clogger::notice("ciqueue queuename: " . $strQueueName . " operation: " . $strOperation . " response: " . json_encode($retArray));
         //            var_dump($retArray);
         return $retArray["reserved"] == 0;
     } else {
         Clogger::warning("connect error queuename: " . $strQueueName . " operation: " . $strOperation);
         return FALSE;
     }
 }
コード例 #2
0
 public function processMessage()
 {
     while (true) {
         $spawn = socket_accept($this->m_socket);
         if (!$spawn) {
             Clogger::warning("socket_accept() failed:" . socket_strerror($spawn));
             continue;
         }
         socket_set_option($spawn, SOL_SOCKET, SO_SNDTIMEO, array("sec" => 1, "usec" => 0));
         socket_set_option($spawn, SOL_SOCKET, SO_RCVTIMEO, array("sec" => 1, "usec" => 0));
         // 尽量保持长链接
         while (true) {
             if ($this->isNeedDie()) {
                 die("need to die\n");
             }
             $this->m_message_done_count++;
             $bindata = socket_read($spawn, XHEAD_SIZE);
             if (strlen($bindata) != XHEAD_SIZE) {
                 $errCode = socket_last_error();
                 Clogger::warning("read xhead size[" . strlen($bindata) . "] != 32 errCode[{$errCode}]");
                 socket_close($spawn);
                 break;
             }
             $xhead = unpack(FORMAT_XHEAD_DECODE, $bindata);
             $cltIP = "";
             socket_getpeername($spawn, $cltIP);
             if ($this->m_last_log_id == $xhead["log_id"] && $this->m_last_server == $cltIP && $this->m_last_file_no == $xhead["version"] && $this->m_last_block_id == $xhead["reserved"]) {
                 Clogger::warning("dup message log_id[{$this->m_log_id}] file_no[{$this->m_last_file_no}] " . "block_id[{$this->m_last_block_id}] server[{$cltIP}]");
                 $strMessage = $this->readSocketForDataLength($spawn, $xhead["detail_len"]);
                 if (strlen($strMessage) != $xhead["detail_len"]) {
                     socket_close($spawn);
                     break;
                 } else {
                     $binaryData = pack(FORMAT_XHEAD_ENCODE, $xhead["log_id"], "ccphpsdk", 0, 0, 0);
                     socket_write($spawn, $binaryData);
                     continue;
                 }
             }
             $strMessage = $this->readSocketForDataLength($spawn, $xhead["detail_len"]);
             $intMessageLen = strlen($strMessage);
             if ($intMessageLen != $xhead["detail_len"]) {
                 Clogger::warning("read message size[{$intMessageLen}] != " . $xhead['detail_len']);
                 socket_close($spawn);
                 break;
             }
             $arrMessage = json_decode($strMessage, true);
             //                var_dump($arrMessage);
             if ($arrMessage == FALSE || $arrMessage == NULL) {
                 Clogger::warning("json_decode message[{$strMessage}] fail");
                 socket_close($spawn);
                 break;
             }
             if (call_user_func($this->m_user_call_back, $arrMessage)) {
                 $this->m_last_log_id = $xhead["log_id"];
                 $this->m_last_file_no = $xhead["version"];
                 $this->m_last_block_id = $xhead["reserved"];
                 $this->m_last_server = $cltIP;
                 $binaryData = pack("Ia16III", $xhead["log_id"], "ccphpsdk", 0, 0, 0);
                 $ret = socket_write($spawn, $binaryData);
                 Clogger::notice("messageCallBackFunc exec success IP: " . $cltIP . " ret: " . $ret . " head: " . json_encode($xhead) . " message: " . $strMessage);
             } else {
                 // 处理失败
                 Clogger::warning("messageCallBackFunc exec fail. head: " . json_encode($xhead) . " message: " . $strMessage);
                 socket_close($spawn);
                 break;
             }
         }
     }
 }