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
![]() |
|||||
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
![]() |
|||||
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 |