вопрос
Всем привет 2023! Пытаюсь сообразить как подключить Memcache кеширование к скрипту. Сейчас создается файловый кеш для каждого города свой.
Реально ли вообще подключить Memcache?
Реально ли вообще подключить Memcache?
<?php
if( !defined('DATALIFEENGINE') ) {
header( "HTTP/1.1 403 Forbidden" );
header ( 'Location: ../../' );
die( "Hacking attempt!" );
}
require_once (DLEPlugins::Check(ENGINE_DIR."/modules/weather_geo.php" ));
$geoplugin = new geoPlugin();
// Определение положения по IP
$geoplugin->locate();
$lat = $geoplugin->latitude; // Широта
$lon = $geoplugin->longitude; // Долгота
$city = $geoplugin->city; // Город
$appid = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // API-ключ
$url = 'https://api.openweathermap.org/data/2.5/onecall?lat=' . $lat . '&lon=' . $lon . '&units=metric&exclude=minutely,alerts&appid=' . $appid . '&lang=ru';
[b]$cache_json = 'engine/cache/weather_7_days_' . $lat. '.' . $lon . '.json.cache';
$ageInSeconds = 1800; // Время жизни кэша в секундах[/b]
// Загружаем или обновляем файл кэш при необходимости
[b]if (!file_exists($cache_json) || $ageInSeconds < $_TIME - filemtime($cache_json) || filesize($cache_json) == 0) {
$contents = file_get_contents($url);
if ($contents) {
file_put_contents($cache_json, $contents);
}
}
[/b]
// Открываем и декодируем JSON
[b]$json = json_decode(stream_get_contents(fopen($cache_json, 'r')));[/b]
// Массивы для замены
$week_min = array('Вс.', 'Пн.', 'Вт.', 'Ср.', 'Чт.', 'Пт.', 'Сб.');
$months = array(1 => 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря');
$week_full = array('воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота');
// Добавляем плюс к положительной температуре
function temp_plus($temp)
{
if (round($temp, 0) > 0) {
return '+' . round($temp, 0);
} elseif (round($temp, 0) < 0) {
return round($temp, 0);
} else {
return 0;
}
}
// Меняем направление ветра с градусов на привычные С, СВ, В и т. д.
function wind_deg($wind, $wind_speed)
{
if (round($wind_speed, 1) !== 0) {
$ws = '<span>Ветер</span> ' . round($wind_speed, 1) . ' м/с';
if ($wind >= 337.5 || $wind <= 22.5) {
return $ws . ', <i class="wind-icon wind-icon_n"></i>С';
} elseif ($wind > 292.5) {
return $ws . ', <i class="wind-icon wind-icon_nw"></i>СЗ';
} elseif ($wind >= 247.5) {
return $ws . ', <i class="wind-icon wind-icon_w"></i>З';
} elseif ($wind > 202.5) {
return $ws . ', <i class="wind-icon wind-icon_sw"></i>ЮЗ';
} elseif ($wind >= 157.5) {
return $ws . ', <i class="wind-icon wind-icon_s"></i>Ю';
} elseif ($wind > 112.5) {
return $ws . ', <i class="wind-icon wind-icon_se"></i>ЮВ';
} elseif ($wind >= 67.5) {
return $ws . ', <i class="wind-icon wind-icon_e"></i>В';
} elseif ($wind > 22.5) {
return $ws . ', <i class="wind-icon wind-icon_ne"></i>СВ';
}
} else {
return 'Штиль';
}
}
// Давление гПа переводим в Па
function pressure_pa($pressure)
{
return round($pressure * 0.75006375541921, 0);
}
// Иконки по id
function icons($id, $icon)
{
// гроза 2xx
if ($id == 200 || $id == 230 || $id == 231) {
return str_replace(['11d', '11n'], 'st_r1_c3', $icon);
} elseif ($id == 201 || $id == 232) {
return str_replace(['11d', '11n'], 'st_r2_c3', $icon);
} elseif ($id == 202) {
return str_replace(['11d', '11n'], 'st_r3_c3', $icon);
} elseif ($id == 210 || $id == 211 || $id == 212 || $id == 221) {
return str_replace(['11d', '11n'], 'st_c3', $icon);
// морось 3xx
} elseif ($id == 300 || $id == 301 || $id == 310 || $id == 311) {
return str_replace(['09d', '09n'], 'c3_r1', $icon);
} elseif ($id == 302 || $id == 312) {
return str_replace(['09d', '09n'], 'c3_r2', $icon);
} elseif ($id == 313 || $id == 314 || $id == 321) {
return str_replace(['09d', '09n'], 'c3_r3', $icon);
// дождь 5xx
} elseif ($id == 500 || $id == 501) {
return str_replace(['10d', '10n'], 'c3_r1', $icon);
} elseif ($id == 502 || $id == 520) {
return str_replace(['10d', '10n', '09d', '09n'], 'c3_r2', $icon);
} elseif ($id == 503 || $id == 504 || $id == 521 || $id == 522 || $id == 531) {
return str_replace(['10n', '10d', '09d', '09n'], 'c3_r3', $icon);
} elseif ($id == 511) {
return str_replace(['13d', '13n'], 'c3_rs2', $icon);
// снег 6xx
} elseif ($id == 600) {
return str_replace(['13d', '13n'], 'c3_s1', $icon);
} elseif ($id == 601) {
return str_replace(['13d', '13n'], 'c3_s2', $icon);
} elseif ($id == 602) {
return str_replace(['13d', '13n'], 'c3_s3', $icon);
} elseif ($id == 611 || $id == 615) {
return str_replace(['13d', '13n'], 'c3_rs1', $icon);
} elseif ($id == 612 || $id == 616 || $id == 620) {
return str_replace(['13d', '13n'], 'c3_rs2', $icon);
} elseif ($id == 613 || $id == 621 || $id == 622) {
return str_replace(['13d', '13n'], 'c3_rs3', $icon);
// туман 7xx
} elseif ($id == 701 || $id == 711 || $id == 721 || $id == 731 || $id == 741 || $id == 751 || $id == 761 || $id == 762 || $id == 771 || $id == 781) {
return str_replace(['50d', '50n'], 'mist', $icon);
// ясно 800
} elseif ($id == 800) {
return str_replace('01', '', $icon);
// облака 8xx
} elseif ($id == 801) {
return str_replace('02', 'c1_', $icon);
} elseif ($id == 802 || $id == 803) {
return str_replace(['03', '04'], 'c2_', $icon);
} elseif ($id == 804) {
return str_replace(['04d', '04n'], 'c3', $icon);
}
}
// Текущая погода
echo '<h2 class="ftitle">Прогноз погоды г. ' . $city . '</h2><div class="stpog"><div class="stpog__temp"><div class="stpog__cels">' . temp_plus($json->current->temp) . '°</div><img src="/templates/' . $config['skin'] . '/images/weather/' . icons($json->current->weather[0]->id, $json->current->weather[0]->icon) . '.svg?v=3" alt="" /><div class="stpog__pw"><div class="stpog__description">' . $json->current->weather[0]->description . '</div><div><span>Ощущается как</span> ' . temp_plus($json->current->feels_like) . '°</div></div></div><div class="stpog__inf"><div>' . wind_deg($json->current->wind_deg, $json->current->wind_speed) . '</div><div><span>Давление</span> ' . pressure_pa($json->current->pressure) . ' мм. рт. ст.</div><div><span>Влажность</span> ' . $json->current->humidity . ' %</div></div></div>';
// Почасовая погода в слайдере
echo '<div class="owl-carousel">';
$hourly_week_f = '';
foreach ($json->hourly as $hourly) {
$hourly_week_t = $week_min[date('w', $hourly->dt)];
if ($hourly_week_f !== $hourly_week_t) {
$hourly_week_f = $hourly_week_t;
$hourly_week = $hourly_week_t;
$hourly_border_left = ' hourly_border_left';
} else {
$hourly_week = '';
$hourly_border_left = '';
}
echo '<div class="item' . $hourly_border_left . '" title="' . $hourly->weather[0]->description . '"><div><span class="hourly_week">' . $hourly_week . '</span> <span class="hourly_time">' . date('G:i', $hourly->dt) . '</span></div><img src="/templates/' . $config['skin'] . '/images/weather/' . icons($hourly->weather[0]->id, $hourly->weather[0]->icon) . '.svg?v=3" alt="" /><div class="hourly_temp">' . temp_plus($hourly->temp) . '°</div></div>';
}
echo '</div>';
// Подробная погода на несколько дней вперёд
foreach ($json->daily as $daily) {
$daily_week = date('w', $daily->dt);
if ($daily_week == '0' || $daily_week == '6') {
$daily_weekends = ' daily__weekends';
} else {
$daily_weekends = '';
}
if (date('dmY', $daily->dt) == date('dmY', $_TIME)) {
$daily_week_today = 'сегодня';
} elseif (date('dmY', $daily->dt) == date('dmY', $_TIME + 86400)) {
$daily_week_today = 'завтра';
} elseif (date('dmY', $daily->dt) == date('dmY', $_TIME - 86400)) {
$daily_week_today = 'вчера';
} else {
$daily_week_today = $week_full[$daily_week];
}
$daily_daylight_hours = floor(($daily->sunset - $daily->sunrise) / 3600) . ' ч ' . floor(($daily->sunset - $daily->sunrise) % 3600 / 60) . ' мин';
echo '<div class="daily"><div class="daily__left"><div class="daily__date' . $daily_weekends . '"><div class="daily__date-left">' . date('j', $daily->dt) . '</div><div class="daily__date-right"><span>' . $months[date('n', $daily->dt)] . '</span><span>' . $daily_week_today . '</span></div></div><div class="daily__icon"><img src="/templates/' . $config['skin'] . '/images/weather/' . icons($daily->weather[0]->id, $daily->weather[0]->icon) . '.svg?v=3" alt="" /><div><div>' . $daily->weather[0]->description . '</div><div>' . wind_deg($daily->wind_deg, $daily->wind_speed) . '</div><div><span>Давление</span> ' . pressure_pa($daily->pressure) . ' мм. рт. ст.</div><div><span>Влажность</span> ' . $daily->humidity . ' %</div></div></div></div><div class="daily__centr"><div class="daily__centr-header"><span>Утро</span><span>День</span><span>Вечер</span><span>Ночь</span></div><div class="daily__temp"><span>' . temp_plus($daily->temp->morn) . '°</span><span>' . temp_plus($daily->temp->day) . '°</span><span>' . temp_plus($daily->temp->eve) . '°</span><span>' . temp_plus($daily->temp->night) . '°</span></div><div class="daily__temp_titl">ощущается как</div><div class="daily__feels_like"><span>' . temp_plus($daily->feels_like->morn) . '°</span><span>' . temp_plus($daily->feels_like->day) . '°</span><span>' . temp_plus($daily->feels_like->eve) . '°</span><span>' . temp_plus($daily->feels_like->night) . '°</span></div></div><div class="daily__right"><div><img src="/templates/' . $config['skin'] . '/images/weather/fct_sn.svg" alt="" /><div class="daily__right-icons"><img src="/templates/' . $config['skin'] . '/images/weather/fct_sn_rs.svg" alt="" /><img src="/templates/' . $config['skin'] . '/images/weather/fct_sn_dwn.svg" alt="" /></div><div class="daily__right-icons"><span>' . date('G:i', $daily->sunrise) . '</span><span>' . date('G:i', $daily->sunset) . '</span></div><span class="daily__daylight">Световой день</span> <span>' . $daily_daylight_hours . '</span></div></div></div>';
}
?>