/** * @param string $msg * @param string $method_sig */ public function debug_method_signature($msg, $method_sig) { if ($this->debug) { $protocolClass = $this->PROTOCOL_CONSTANTS_CLASS; $this->debug_msg(sprintf($msg . ': %s', MiscHelper::methodSig($method_sig), $protocolClass::$GLOBAL_METHOD_NAMES[MiscHelper::methodSig($method_sig)])); } }
/** * Dump human readable frame information for debugging * * @param int $frame_type * @param int $channel_id * @param string $payload */ protected function frameInfo(int $frame_type, int $channel_id, string $payload) { if ($frame_type == FrameTypes::METHOD) { if (strlen($payload) >= 4) { $method_sig_array = unpack('n2', substr($payload, 0, 4)); $method_sig = $method_sig_array[1] . ',' . $method_sig_array[2]; return Constants091::$FRAME_TYPES[$frame_type] . " " . sprintf('> %s: %s', $method_sig, Constants091::$GLOBAL_METHOD_NAMES[MiscHelper::methodSig($method_sig)]); } } else { return Constants091::$FRAME_TYPES[$frame_type]; } }
public function __construct($reply_code, $reply_text, $method_sig) { parent::__construct($reply_text, $reply_code); $this->amqp_reply_code = $reply_code; // redundant, but kept for BC $this->amqp_reply_text = $reply_text; // redundant, but kept for BC $this->amqp_method_sig = $method_sig; $ms = MiscHelper::methodSig($method_sig); $mn = isset(AbstractChannel::$GLOBAL_METHOD_NAMES[$ms]) ? AbstractChannel::$GLOBAL_METHOD_NAMES[$ms] : ($mn = ""); $this->args = array($reply_code, $reply_text, $method_sig, $mn); }
protected function send_channel_method_frame($channel, $method_sig, $args = "") { if ($args instanceof AMQPWriter) { $args = $args->getvalue(); } $pkt = new AMQPWriter(); $pkt->write_octet(1); $pkt->write_short($channel); $pkt->write_long(strlen($args) + 4); // 4 = length of class_id and method_id // in payload $pkt->write_short($method_sig[0]); // class_id $pkt->write_short($method_sig[1]); // method_id $pkt->write($args); $pkt->write_octet(0xce); $pkt = $pkt->getvalue(); $this->write($pkt); if ($this->debug) { MiscHelper::debug_msg("< " . MiscHelper::methodSig($method_sig) . ": " . AbstractChannel::$GLOBAL_METHOD_NAMES[MiscHelper::methodSig($method_sig)]); } }
/** * Wait for some expected AMQP methods and dispatch to them. * Unexpected methods are queued up for later calls to this Python * method. */ public function wait($allowed_methods = NULL, $non_blocking = false) { if ($allowed_methods) { if ($this->debug) { MiscHelper::debug_msg("waiting for " . implode(", ", $allowed_methods)); } } else { if ($this->debug) { MiscHelper::debug_msg("waiting for any method"); } } //Process deferred methods foreach ($this->method_queue as $qk => $queued_method) { if ($this->debug) { MiscHelper::debug_msg("checking queue method " . $qk); } $method_sig = $queued_method[0]; if ($allowed_methods == NULL || in_array($method_sig, $allowed_methods)) { unset($this->method_queue[$qk]); if ($this->debug) { MiscHelper::debug_msg("Executing queued method: {$method_sig}: " . self::$GLOBAL_METHOD_NAMES[MiscHelper::methodSig($method_sig)]); } return $this->dispatch($queued_method[0], $queued_method[1], $queued_method[2]); } } // No deferred methods? wait for new ones while (true) { $frm = $this->next_frame(); $frame_type = $frm[0]; $payload = $frm[1]; if ($frame_type != 1) { throw new Exception("Expecting AMQP method, received frame type: {$frame_type}"); } if (strlen($payload) < 4) { throw new Exception("Method frame too short"); } $method_sig_array = unpack("n2", substr($payload, 0, 4)); $method_sig = "" . $method_sig_array[1] . "," . $method_sig_array[2]; $args = new AMQPReader(substr($payload, 4)); if ($this->debug) { MiscHelper::debug_msg("> {$method_sig}: " . self::$GLOBAL_METHOD_NAMES[MiscHelper::methodSig($method_sig)]); } if (in_array($method_sig, self::$CONTENT_METHODS)) { $content = $this->wait_content(); } else { $content = NULL; } if ($allowed_methods == NULL || in_array($method_sig, $allowed_methods) || in_array($method_sig, self::$CLOSE_METHODS)) { return $this->dispatch($method_sig, $args, $content); } // Wasn't what we were looking for? save it for later if ($this->debug) { MiscHelper::debug_msg("Queueing for later: {$method_sig}: " . self::$GLOBAL_METHOD_NAMES[MiscHelper::methodSig($method_sig)]); } $this->method_queue[] = array($method_sig, $args, $content); if ($non_blocking) { break; } } }