angelcamposm /
ping
| 1 | <?php |
||
| 2 | |||
| 3 | /** |
||
| 4 | * Ping for Laravel. |
||
| 5 | * |
||
| 6 | * This class makes Ping request to a host. |
||
| 7 | * |
||
| 8 | * Ping uses the ICMP protocol's mandatory ECHO_REQUEST datagram to elicit an ICMP ECHO_RESPONSE from a host or gateway. |
||
| 9 | * |
||
| 10 | * @author Angel Campos <[email protected]> |
||
| 11 | * @requires PHP 8.0 |
||
| 12 | * |
||
| 13 | * @version 2.1.2 |
||
| 14 | */ |
||
| 15 | |||
| 16 | namespace Acamposm\Ping; |
||
| 17 | |||
| 18 | use Acamposm\Ping\Exceptions\TimerNotStartedException; |
||
| 19 | use DateTime; |
||
| 20 | |||
| 21 | /** |
||
| 22 | * Utility Class to control time elapsed in commands. |
||
| 23 | */ |
||
| 24 | class Timer |
||
| 25 | { |
||
| 26 | /** |
||
| 27 | * Format for the timestamps. |
||
| 28 | */ |
||
| 29 | public const FORMAT = 'd-m-Y H:i:s.u'; |
||
| 30 | |||
| 31 | /** |
||
| 32 | * Timer START. |
||
| 33 | * |
||
| 34 | * @var float |
||
| 35 | */ |
||
| 36 | protected float $start; |
||
| 37 | |||
| 38 | /** |
||
| 39 | * Timer END. |
||
| 40 | * |
||
| 41 | * @var float |
||
| 42 | */ |
||
| 43 | protected float $stop; |
||
| 44 | |||
| 45 | /** |
||
| 46 | * Timer constructor. |
||
| 47 | */ |
||
| 48 | public function __construct(protected string $format = self::FORMAT) |
||
| 49 | { |
||
| 50 | return $this; |
||
| 51 | } |
||
| 52 | |||
| 53 | /** |
||
| 54 | * Start the Timer. |
||
| 55 | * |
||
| 56 | * @return float |
||
| 57 | */ |
||
| 58 | public function Start(): float |
||
| 59 | { |
||
| 60 | return $this->start = microtime(true); |
||
|
0 ignored issues
–
show
Bug
Best Practice
introduced
by
Loading history...
|
|||
| 61 | } |
||
| 62 | |||
| 63 | /** |
||
| 64 | * Stop the Timer. |
||
| 65 | * |
||
| 66 | * @throws TimerNotStartedException |
||
| 67 | * @retun float |
||
| 68 | */ |
||
| 69 | public function Stop(): float |
||
| 70 | { |
||
| 71 | if (!isset($this->start)) { |
||
| 72 | throw new TimerNotStartedException(); |
||
| 73 | } |
||
| 74 | |||
| 75 | return $this->stop = microtime(true); |
||
|
0 ignored issues
–
show
|
|||
| 76 | } |
||
| 77 | |||
| 78 | /** |
||
| 79 | * Returns an object with the Timer details. |
||
| 80 | * |
||
| 81 | * @return object |
||
| 82 | */ |
||
| 83 | public function GetResults(): object |
||
| 84 | { |
||
| 85 | if (!isset($this->stop)) { |
||
| 86 | $this->stop = microtime(true); |
||
| 87 | } |
||
| 88 | |||
| 89 | return (object) [ |
||
| 90 | 'start' => $this->getTimeObject($this->start), |
||
| 91 | 'stop' => $this->getTimeObject($this->stop), |
||
| 92 | 'time' => $this->getTimeElapsed(), |
||
| 93 | ]; |
||
| 94 | } |
||
| 95 | |||
| 96 | /** |
||
| 97 | * Returns a DateTime instance from timestamp. |
||
| 98 | * |
||
| 99 | * @param float $timestamp |
||
| 100 | * |
||
| 101 | * @return DateTime |
||
| 102 | */ |
||
| 103 | private static function getDateTimeObjectFromTimeStamp(float $timestamp): DateTime |
||
| 104 | { |
||
| 105 | return DateTime::createFromFormat('U.u', $timestamp); |
||
| 106 | } |
||
| 107 | |||
| 108 | /** |
||
| 109 | * Returns an object with the timestamp as a float and as a human-readable. |
||
| 110 | * |
||
| 111 | * @param float $timestamp |
||
| 112 | * |
||
| 113 | * @return object |
||
| 114 | */ |
||
| 115 | private function getTimeObject(float $timestamp): object |
||
| 116 | { |
||
| 117 | $date_time = self::getDateTimeObjectFromTimeStamp($timestamp); |
||
| 118 | |||
| 119 | return (object) [ |
||
| 120 | 'as_float' => $timestamp, |
||
| 121 | 'human_readable' => $date_time->format($this->format), |
||
| 122 | ]; |
||
| 123 | } |
||
| 124 | |||
| 125 | /** |
||
| 126 | * Returns the elapsed time between start and stop. |
||
| 127 | * |
||
| 128 | * @return float |
||
| 129 | */ |
||
| 130 | private function getTimeElapsed(): float |
||
| 131 | { |
||
| 132 | $time_elapsed = $this->stop - $this->start; |
||
| 133 | |||
| 134 | return round($time_elapsed, 3, PHP_ROUND_HALF_DOWN); |
||
| 135 | } |
||
| 136 | } |
||
| 137 |