V

V

Был в сети 09 сентября 2025, 19:21
Заказы не принимаю
  1. результат парсинга заносим в контент;
  2. чистим кэш только этого ресурса;
  3. для обновления кэша пользователь должен зайти на страницу и получить задержку в несколько секунд (в моём случае), вместо этого мы заходим на страницу кроном.

мой велосипед это и делает, кроме заноса прямиком в контент и углубления в API MODX
когда обработка данных закончится он мигом запишет данные в ресурс и пользователь получит актуальную информацию.
разве после того, как записать результат в контент ресурса, не нужно будет очистить кэш этого ресурса, после этого обновить кэш этого ресурса, чтобы пользователь получил обновленную инфу?
Смысл в быстродействии.

У меня так: есть огромная страница, которую нужно спарсить раз в неделю и парсинг занимает много времени, если парсить каждый раз по окончанию действия кэша или ручной очистки кэша с админки, первому посетителю придется ждать десятки секунд (а он не будет ждать). Решил я парсить её cron-ом раз в неделю отдельным php скриптом, результат сохранять в файл на сервере (около 0.5 мб). Таким образом сниппет «snippetName» с примера выше, просто выполняет чтение и возврат этого файла «echo file_get_contents($file);», что существенно ускоряет время загрузки страницы если я очистил кэш вручную или время кэша закончилось. Потом я cron-ом выполняю запуск того самого php скрипта, который сохраняет результат в локальный файл. Вот такой вот многослойный торт.
спасибо!

может кому-то пригодится:
<?php
// https://sypexgeo.net/ru/docs/
include($_SERVER['DOCUMENT_ROOT'].'/SxGeo/SxGeo.php'); 
$SxGeo = new SxGeo($_SERVER['DOCUMENT_ROOT'].'/SxGeo/SxGeoCity.dat');

//$ip = $_SERVER['REMOTE_ADDR'];
$ip = '109.252.7.175';
$city = $SxGeo->get($ip);
//var_dump($city);
$location = $city['city']['name_ru'];

$q = $modx->newQuery('modResource');
$q->where(array('parent' => 140, 'pagetitle:LIKE' => '%'.$location.'%'));
$сollection = $modx->getCollection('modResource', $q);

$i = 0;
$results = [];

foreach ($сollection as $record) {
    $results[$i] = [$record->get('id'),$record->get('pagetitle')];
    $i++;
}
//var_dump($results);
foreach ($results as $item) {
    if ($item[1] == $location) {
        echo 'Res ID: '.$item[0].', Res pagetitle: '.$item[1];
        //что-то делаем с этими данными
    };
}
{11 | declension : 'отзыв|отзыва|отзывов' : true}
declension (decl) — склоняет слово, следующее за числом по правилам русского языка. Например: 1 яблоко, 2 яблока, 10 яблок. Вторым параметром указывается выводить ли само число, по умолчанию выводится только подходящий вариант слова. Разделитель вариантов можно задавать третьим параметром, по умолчанию |.
{6 | declension : 'яблоко|яблока|яблок'} // яблок
{3 | declension : 'яблоко|яблока|яблок' : true} // 3 яблока
{101 | decl : 'яблоко,яблока,яблок' : false : ','} // яблоко