/** * Update data inside descriptor to make one more attempt * * @param RequestDescriptor $descriptor Operation descriptor * @param string $when When Timeout occurerd, one of TimeoutEvent::DURING_* consts * * @return void */ private function updateMetadataForAttempt(RequestDescriptor $descriptor, $when) { switch ($when) { case TimeoutEvent::DURING_IO: $descriptor->setMetadata(RequestExecutorInterface::META_LAST_IO_START_TIME, null); break; case TimeoutEvent::DURING_CONNECTION: $descriptor->setRunning(false); $descriptor->setMetadata([RequestExecutorInterface::META_LAST_IO_START_TIME => null, RequestExecutorInterface::META_CONNECTION_START_TIME => null, RequestExecutorInterface::META_CONNECTION_FINISH_TIME => null]); break; } }
/** * Set start or finish time in metadata of the socket * * @param RequestDescriptor $requestDescriptor Socket meta data * @param string $key Metadata key to set * * @return void * @throws \InvalidArgumentException */ protected function setSocketOperationTime(RequestDescriptor $requestDescriptor, $key) { $meta = $requestDescriptor->getMetadata(); $table = [RequestExecutorInterface::META_CONNECTION_START_TIME => $meta[RequestExecutorInterface::META_CONNECTION_START_TIME] === null, RequestExecutorInterface::META_CONNECTION_FINISH_TIME => $meta[RequestExecutorInterface::META_CONNECTION_FINISH_TIME] === null, RequestExecutorInterface::META_LAST_IO_START_TIME => $meta[RequestExecutorInterface::META_CONNECTION_FINISH_TIME] !== null]; if (isset($table[$key]) && $table[$key]) { $requestDescriptor->setMetadata($key, microtime(true)); } }
/** * Disconnects given socket descriptor * * @param RequestDescriptor $descriptor Socket descriptor * * @return void */ public function disconnect(RequestDescriptor $descriptor) { $meta = $descriptor->getMetadata(); $socket = $descriptor->getSocket(); $descriptor->setMetadata(RequestExecutorInterface::META_REQUEST_COMPLETE, true); try { $socket->close(); if ($meta[RequestExecutorInterface::META_CONNECTION_FINISH_TIME] !== null) { $this->callSocketSubscribers($descriptor, $this->createEvent($descriptor, EventType::DISCONNECTED)); } } catch (SocketException $e) { $this->callExceptionSubscribers($descriptor, $e); } $this->callSocketSubscribers($descriptor, $this->createEvent($descriptor, EventType::FINALIZE)); $this->removeOperationsFromSelector($descriptor); }
/** * Fill next operation in given object and return flag indicating whether operation is required * * @param RequestDescriptor $requestDescriptor Request descriptor object * @param OperationInterface $nextOperation Next operation object * * @return bool True if given operation is complete */ private function resolveNextOperation(RequestDescriptor $requestDescriptor, OperationInterface $nextOperation) { if ($nextOperation instanceof NullOperation) { $requestDescriptor->setOperation($nextOperation); return true; } if ($requestDescriptor->getOperation() === $nextOperation) { return false; } $requestDescriptor->setOperation($nextOperation); $requestDescriptor->setMetadata([RequestExecutorInterface::META_LAST_IO_START_TIME => null]); return false; }