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; } }
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; } } } }