За последние 24 часа нас посетили 18934 программиста и 1613 роботов. Сейчас ищут 643 программиста ...

Необходимо усовершенствовать кэширование динамических страниц

Тема в разделе "PHP для новичков", создана пользователем Gsmnet, 15 янв 2018.

  1. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    Доброго времени суток.
    Собственно задачка в заголовке - Необходимо усовершенствовать кэширование динамических страниц.
    Как это выглядит - парсится некий сайт, и скрипт кэширует его , к примеру, на 1 час.
    При обращении к данной странице в течении часа она будет отдаваться из кэша, а по истечении часа загрузит снова внешний сайт.

    Возможные проблемы:
    - Внешний сайт недоступен, и новый файл кэша запишется пустой на целый час.
    - посетитель приостановил загрузку страницы, или у него произошел обрыв соединения, и только часть страницы попала в кэш и целый час будет в таком виде отдаваться из кэша.

    Вот собственно я и подошел к самому главному. Как подстраховаться?

    Скрипт кэширования:
    PHP:
    1. <?php
    2. $url=$_SERVER['REQUEST_URI'];
    3. $crc=md5($url) . '.xml';
    4. $modif=time()-@filemtime ('cache/'.$crc);
    5. if ($modif<3600)
    6. {
    7. include ('cache/'.$crc); exit();
    8. }
    9. ?>
    10.  
    11. <?php
    12. скрипт парсера
    13. ?>
    14.  
    15. <?php
    16. $cache = ob_get_contents();
    17. echo $cache;
    18. $fp = @fopen ('cache/'.$crc, 'w');
    19. @fwrite ($fp, $cache);
    20. @fclose ($fp);
    21. ?>
     
    #1 Gsmnet, 15 янв 2018
    Последнее редактирование: 15 янв 2018
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    1) Проверять - не пустой ли файл кеша получился - если да - пытаться еще 1-2-3 - сколько раз сформировать кэш
    2) Кэш то на стороне сервера работает - ему фиолетово чего там у клиента со связью или приостановкой..... ваш сайт получил команду - начал формирование кеша (если не было) - клиент может даже взорвать свой комп - ваш сервер об этом не узнает и сделает кеш все равно
     
    Gsmnet нравится это.
  3. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    Кстати, файл кэша, даже при отсутствии соединения с внешним источником, все равно не будет пустым. Присутствуют в начале мои meta теги, меню и др элементы

    Допустим данные парсера я выделю в отдельный файл, и затем инклудом вставлю в свой шаблон. Тогда файл кэша действительно будет пустым при отсутствии коннекта с внешним источником.

    Может подскажите как реализовать в скрипте проверку на пустой файл , и запрет перезаписывать полный файл пустым?
     
    #3 Gsmnet, 15 янв 2018
    Последнее редактирование: 15 янв 2018
  4. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    Или, может существуют какие-то другие решения?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не затирайте старый кеш до успешной перезаписи новым (т.е. накапливайте новый в файле с другим именем, к примеру). А вообще, что там у вас за парсинг? Здесь нельзя обсуждать парсеры
     
  6. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    Если не разрешено, то и не будем. Хотя там все законно.
    А по поводу не затирать, я даже не представляю как в скрипте указать понятие успешен ли новый файл или нет. По каким параметрам успешность определяется :) ? Пустой/не пустой файл еще понятно.
     
  7. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Определите какие то ключевые параметры при отсутствии которых обновлять страницу нет смысла.
     
  8. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    @Gsmnet
    в том месте где скачивается страница с внешнего сайта, проверять что пришло. если пусто, или нет необходимых для парсинга элементов, выставляем флаг, что данных новых нет.
    а внизу добавляем условие, чтобы запись в файл была только если есть новые данные.
     
    Gsmnet и keren нравится это.
  9. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    То-есть, к примеру, в скрипте указана строка во внешнем документе начиная с которой он нам нужен, и эта строка к нам не поступила, то считать что документ не доступен. Класс! Знать бы еще как это реализовать. Для меня это пока непостижимо. Спасибо за интересную идею!
     
  10. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    Или, наверное лучше, если не поступила последняя нужная строка. Тогда считать что документ недоступен, либо нет возможности скачать его полностью
     
  11. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    можно и так.
    а можно много проверок разных добавить. и если хоть на одной из них условие сработает - значит с данными чтото не то, и поднимаем флаг запрета перезаписи файла..
     
    Gsmnet нравится это.
  12. Taktreba

    Taktreba Активный пользователь

    С нами с:
    11 янв 2017
    Сообщения:
    543
    Симпатии:
    132
    а чего? правилами сайта? или карой господней? (я реально не знаю чего)
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Да, правилами форума.
     
  14. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Да здесь долбят спамом парся дыры в этом форуме вот у них и батхерт, хотя парсинг тоже нужен, поменять например теги в документе, в ручную надо что ли?
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не, если свои документы - то пожалуйста. Здесь не любят обсуждение парсинга чужих сайтов
     
  16. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Инструмент то один и тот-же. Ты же написал в общем:
     
  17. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    А можно конкретный кейс, когда необходим парсинг своего ресурса?
     
  18. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    Да легко..... У меня есть свой сайт икея ком.... (честное пионерское он мой), хочу сделать региональный.Причина почему нельзя иначе, внутренние технические условия про которые я не могу говорить ибо тайна :D
     
    romach нравится это.
  19. Gsmnet

    Gsmnet Новичок

    С нами с:
    20 дек 2017
    Сообщения:
    24
    Симпатии:
    2
    Немного от темы топика отклонились :). Буду благодарен если кто-нибудь покажет пример реализации
    проверки источника на наличие начальной и конечной необходимых фраз, и если эти фразы недоступны, то запретить скрипту кэша перезаписывать предыдущий сохраненный файл. В общем, то, что мы обсуждали Выше, до того как обсуждение изменило русло :)
     
  20. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    Например старый сайт перенести на новый движок, да мало ли, может быть и чужой на законных основаниях, на lynda кейс - Exploring Lake Pend Oreille.
     
  21. voral

    voral Активный пользователь

    С нами с:
    30 ноя 2017
    Сообщения:
    646
    Симпатии:
    104
    1. Выполняете типовое кеширование, но на долгий срок, всех полученных данных
    2. Выполняете типовое кешширование признака, что страница закеширована (или просто сохраняете время последнего создания кеша)
    3. При необходимости смотрите на кеш 2.
    3.1 если он существует и свеж - отдаете текущее состояние из кеша 1.
    3.2 если он протух и отсутствует - пробуете запросить новые данные,
    3.2.1если не получилось: отдаете из кеша 1
    3.2.2 еси получилось обновляете кеш 1 и 2
    4. если протух кеш 1. Обновляете кеш 1 и 2. Если данные не получиось вернуть возвращаете ошибку "страница временно не доступна"
    --- Добавлено ---
    В этом случае нет ни каких вопросов кеширования. Поддключаетесь сразу к двум БД и перегоняете данные, лио обходите локальные файлы и их обрабатываете.
     
  22. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    парсинг сторонних сайтов широко используется не только спамерами и хакерами.
    например надо экспортировать какието данные с сайта поставщиков, договор есть, апи есть, но оно глючное, либо неполное. приходится часть данных доставать руками,иногда эмулируя программно реального клиента, гонять куки, выполнять js, делать задержки между запросами и т.д.
     
    Gsmnet и keren нравится это.