diff --git a/composer.json b/composer.json index cf28b89..55694bb 100644 --- a/composer.json +++ b/composer.json @@ -11,11 +11,11 @@ } ], "require": { - "php": ">=5.3", - "react/event-loop": "0.3.*", - "react/promise": "~1.0", - "clue/socket-react": "0.2.*", - "e-butik/iodophor": "1.*" + "php": ">=5.4", + "react/event-loop": "^1.1", + "react/promise": "^2.8", + "clue/socket-react": "dev-master", + "e-butik/iodophor": "^1.0" }, "autoload": { "psr-4": {"Clue\\React\\Icmp\\": "src"} diff --git a/src/Icmp.php b/src/Icmp.php index 6d02b4c..ca4ae72 100644 --- a/src/Icmp.php +++ b/src/Icmp.php @@ -7,7 +7,6 @@ use Iodophor\Io\StringWriter; use Iodophor\Io\StringReader; use React\Promise\Deferred; -use React\Promise\When; use Evenement\EventEmitter; use React\EventLoop\LoopInterface; use Socket\React\Datagram\Factory as SocketFactory; @@ -16,6 +15,7 @@ use React\EventLoop\Timer\Timer; use Socket\React\Datagram\Socket as Socket; use Clue\Hexdump\Hexdump; +use function React\Promise\resolve; /** * ICMP (Internet Control Message Protocol) bindings for reactphp @@ -53,7 +53,7 @@ public function __construct(LoopInterface $loop, Socket $socket = null) * * @param string $remote remote host or IP address to ping * @param float $timeout maximum time in seconds to wait to receive pong - * @return React\Promise\PromiseInterface resolves with ping round trip time (RTT) in seconds or rejects with Exception + * @return \React\Promise\PromiseInterface resolves with ping round trip time (RTT) in seconds or rejects with Exception */ public function ping($remote, $timeout = 5.0) { @@ -64,7 +64,10 @@ public function ping($remote, $timeout = 5.0) $result = new Deferred(); - $timer = $this->loop->addTimer($timeout, function(Timer $timer) use ($that, $result, &$listener) { + $isTimerRunning = true; + + $timer = $this->loop->addTimer($timeout, function(Timer $timer) use ($that, $result, &$listener, &$isTimerRunning) { + $isTimerRunning = false; if ($listener) { $that->removeListener(Message::TYPE_ECHO_REPLY, $listener); } @@ -78,15 +81,15 @@ public function ping($remote, $timeout = 5.0) $start, $timer, $result, - &$listener + &$listener, + &$isTimerRunning, + $timeout ) { - if (!$timer->isActive()) { + if (!$isTimerRunning) { // timeout occured while resolving hostname => already canceled, so don't even send a message return; } - $ping = $messageFactory->createMessagePing(); - $that->sendMessage($ping, $remote); $id = $ping->getPingId(); @@ -100,11 +103,12 @@ public function ping($remote, $timeout = 5.0) $that, $result, $timer, - $start + $start, + $timeout ) { if ($pong->getPingId() === $id && $pong->getPingSequence() === $sequence) { $that->removeListener(Message::TYPE_ECHO_REPLY, $listener); - $timer->cancel(); + $this->loop->cancelTimer($timer); $time = microtime(true) - $start; if ($time < 0) { @@ -168,6 +172,6 @@ public function sendMessage(Message $message, $remoteAddress) private function resolve($host) { - return When::resolve($host); + return resolve($host); } }