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); |
|
|
|
|
75
|
3 |
|
curl_multi_add_handle($mh, $ch); |
|
|
|
|
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
|
|
|
|