Hatooz /
weather-module
| 1 | <?php |
||||
| 2 | |||||
| 3 | namespace Anax\Service; |
||||
| 4 | |||||
| 5 | use Anax\Ipstack\Ipstack; |
||||
| 6 | |||||
| 7 | /** |
||||
| 8 | * A plain service class with no dependencies. |
||||
| 9 | */ |
||||
| 10 | class WeatherService |
||||
| 11 | { |
||||
| 12 | private $message = null; |
||||
| 13 | |||||
| 14 | |||||
| 15 | |||||
| 16 | 6 | public function setMessage(string $message) : void |
|||
| 17 | { |
||||
| 18 | 6 | $this->message = $message; |
|||
| 19 | 6 | } |
|||
| 20 | |||||
| 21 | 3 | public function getWeather($cIp, $cLat, $cLon) |
|||
| 22 | { |
||||
| 23 | 3 | $keyArray = include(__DIR__ . '/../../config/api_keys.php'); |
|||
| 24 | |||||
| 25 | 3 | $stack = new Ipstack(); |
|||
| 26 | 3 | $lat = $cLat; |
|||
| 27 | 3 | $lon = $cLon; |
|||
| 28 | 3 | if (($cLat == null || $cLon == null) && $cIp != null) { |
|||
| 29 | 1 | $response = $stack->getIpInfo($cIp, $keyArray["keys"]["ipstack"]); |
|||
| 30 | 1 | $lat = $response["latitude"]; |
|||
| 31 | 1 | $lon = $response["longitude"]; |
|||
| 32 | } |
||||
| 33 | |||||
| 34 | 3 | $query = "https://api.openweathermap.org/data/2.5/forecast?lat=". $lat . "&lon=". $lon . "&appid=" . $keyArray["keys"]["weather"]; |
|||
| 35 | |||||
| 36 | 3 | if ($lat != null && $lon != null) { |
|||
| 37 | 1 | $res = file_get_contents($query) ?? null; |
|||
| 38 | } |
||||
| 39 | 3 | $info = json_decode($res ?? null, true); |
|||
| 40 | |||||
| 41 | 3 | if ($info == null) { |
|||
| 42 | 2 | $info = ["error" => "Ingen info hittades för angivna ip/koordinater"]; |
|||
| 43 | } |
||||
| 44 | 3 | if (!isset($response)) { |
|||
| 45 | 2 | $response = null; |
|||
| 46 | } |
||||
| 47 | |||||
| 48 | 3 | return ["weather" => $info, "ip" => $response]; |
|||
| 49 | } |
||||
| 50 | |||||
| 51 | 3 | public function getWeatherThroughMultiCurl($cIp, $cLat, $cLon) |
|||
| 52 | { |
||||
| 53 | 3 | $keyArray = include(__DIR__ . '/../../config/api_keys.php'); |
|||
| 54 | 3 | $stack = new Ipstack(); |
|||
| 55 | 3 | $lat = $cLat; |
|||
| 56 | 3 | $lon = $cLon; |
|||
| 57 | 3 | if (($cLat == null || $cLon == null) && $cIp != null) { |
|||
| 58 | 1 | $ipresponse = $stack->getIpInfo($cIp, $keyArray["keys"]["ipstack"]); |
|||
| 59 | 1 | $lat = $ipresponse["latitude"]; |
|||
| 60 | 1 | $lon = $ipresponse["longitude"]; |
|||
| 61 | } |
||||
| 62 | |||||
| 63 | 3 | $dateTime = [time() - 432000, time() - 345600, time() - 259200, time() - 172800, time() - 86400]; |
|||
| 64 | $options = [ |
||||
| 65 | 3 | CURLOPT_RETURNTRANSFER => true, |
|||
| 66 | ]; |
||||
| 67 | |||||
| 68 | // Add all curl handlers and remember them |
||||
| 69 | // Initiate the multi curl handler |
||||
| 70 | 3 | $mh = curl_multi_init(); |
|||
| 71 | 3 | $chAll = []; |
|||
| 72 | 3 | foreach ($dateTime as $dt) { |
|||
| 73 | 3 | $ch = curl_init("https://api.openweathermap.org/data/2.5/onecall/timemachine?lat=". $lat . "&lon=". $lon . "&dt=" . $dt . "&appid=" . $keyArray["keys"]["weather"]); |
|||
| 74 | 3 | curl_setopt_array($ch, $options); |
|||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||||
| 75 | 3 | curl_multi_add_handle($mh, $ch); |
|||
|
0 ignored issues
–
show
It seems like
$ch can also be of type false; however, parameter $ch of curl_multi_add_handle() does only seem to accept resource, maybe add an additional type check?
(
Ignorable by Annotation
)
If this is a false-positive, you can also ignore this issue in your code via the
Loading history...
|
|||||
| 76 | 3 | $chAll[] = $ch; |
|||
| 77 | } |
||||
| 78 | |||||
| 79 | // Execute all queries simultaneously, |
||||
| 80 | // and continue when all are complete |
||||
| 81 | 3 | $running = null; |
|||
| 82 | do { |
||||
| 83 | 3 | curl_multi_exec($mh, $running); |
|||
| 84 | 3 | } while ($running); |
|||
| 85 | |||||
| 86 | // Close the handles |
||||
| 87 | 3 | foreach ($chAll as $ch) { |
|||
| 88 | 3 | curl_multi_remove_handle($mh, $ch); |
|||
| 89 | } |
||||
| 90 | 3 | curl_multi_close($mh); |
|||
| 91 | |||||
| 92 | // All of our requests are done, we can now access the results |
||||
| 93 | 3 | $response = []; |
|||
| 94 | 3 | foreach ($chAll as $ch) { |
|||
| 95 | 3 | $data = curl_multi_getcontent($ch); |
|||
| 96 | 3 | $response[] = json_decode($data, true); |
|||
| 97 | } |
||||
| 98 | |||||
| 99 | 3 | return ["weather" => $response ?? null, "ip" => $ipresponse ?? null]; |
|||
| 100 | } |
||||
| 101 | } |
||||
| 102 |