Доброго времени суток. Собственно задачка в заголовке - Необходимо усовершенствовать кэширование динамических страниц. Как это выглядит - парсится некий сайт, и скрипт кэширует его , к примеру, на 1 час. При обращении к данной странице в течении часа она будет отдаваться из кэша, а по истечении часа загрузит снова внешний сайт. Возможные проблемы: - Внешний сайт недоступен, и новый файл кэша запишется пустой на целый час. - посетитель приостановил загрузку страницы, или у него произошел обрыв соединения, и только часть страницы попала в кэш и целый час будет в таком виде отдаваться из кэша. Вот собственно я и подошел к самому главному. Как подстраховаться? Скрипт кэширования: PHP: <?php $url=$_SERVER['REQUEST_URI']; $crc=md5($url) . '.xml'; $modif=time()-@filemtime ('cache/'.$crc); if ($modif<3600) { include ('cache/'.$crc); exit(); } ob_start (); ?> <?php скрипт парсера ?> <?php $cache = ob_get_contents(); ob_end_clean (); echo $cache; $fp = @fopen ('cache/'.$crc, 'w'); @fwrite ($fp, $cache); @fclose ($fp); ?>
1) Проверять - не пустой ли файл кеша получился - если да - пытаться еще 1-2-3 - сколько раз сформировать кэш 2) Кэш то на стороне сервера работает - ему фиолетово чего там у клиента со связью или приостановкой..... ваш сайт получил команду - начал формирование кеша (если не было) - клиент может даже взорвать свой комп - ваш сервер об этом не узнает и сделает кеш все равно
Кстати, файл кэша, даже при отсутствии соединения с внешним источником, все равно не будет пустым. Присутствуют в начале мои meta теги, меню и др элементы Допустим данные парсера я выделю в отдельный файл, и затем инклудом вставлю в свой шаблон. Тогда файл кэша действительно будет пустым при отсутствии коннекта с внешним источником. Может подскажите как реализовать в скрипте проверку на пустой файл , и запрет перезаписывать полный файл пустым?
Не затирайте старый кеш до успешной перезаписи новым (т.е. накапливайте новый в файле с другим именем, к примеру). А вообще, что там у вас за парсинг? Здесь нельзя обсуждать парсеры
Если не разрешено, то и не будем. Хотя там все законно. А по поводу не затирать, я даже не представляю как в скрипте указать понятие успешен ли новый файл или нет. По каким параметрам успешность определяется ? Пустой/не пустой файл еще понятно.
@Gsmnet в том месте где скачивается страница с внешнего сайта, проверять что пришло. если пусто, или нет необходимых для парсинга элементов, выставляем флаг, что данных новых нет. а внизу добавляем условие, чтобы запись в файл была только если есть новые данные.
То-есть, к примеру, в скрипте указана строка во внешнем документе начиная с которой он нам нужен, и эта строка к нам не поступила, то считать что документ не доступен. Класс! Знать бы еще как это реализовать. Для меня это пока непостижимо. Спасибо за интересную идею!
Или, наверное лучше, если не поступила последняя нужная строка. Тогда считать что документ недоступен, либо нет возможности скачать его полностью
можно и так. а можно много проверок разных добавить. и если хоть на одной из них условие сработает - значит с данными чтото не то, и поднимаем флаг запрета перезаписи файла..
Да здесь долбят спамом парся дыры в этом форуме вот у них и батхерт, хотя парсинг тоже нужен, поменять например теги в документе, в ручную надо что ли?
Да легко..... У меня есть свой сайт икея ком.... (честное пионерское он мой), хочу сделать региональный.Причина почему нельзя иначе, внутренние технические условия про которые я не могу говорить ибо тайна
Немного от темы топика отклонились . Буду благодарен если кто-нибудь покажет пример реализации проверки источника на наличие начальной и конечной необходимых фраз, и если эти фразы недоступны, то запретить скрипту кэша перезаписывать предыдущий сохраненный файл. В общем, то, что мы обсуждали Выше, до того как обсуждение изменило русло
Например старый сайт перенести на новый движок, да мало ли, может быть и чужой на законных основаниях, на lynda кейс - Exploring Lake Pend Oreille.
1. Выполняете типовое кеширование, но на долгий срок, всех полученных данных 2. Выполняете типовое кешширование признака, что страница закеширована (или просто сохраняете время последнего создания кеша) 3. При необходимости смотрите на кеш 2. 3.1 если он существует и свеж - отдаете текущее состояние из кеша 1. 3.2 если он протух и отсутствует - пробуете запросить новые данные, 3.2.1если не получилось: отдаете из кеша 1 3.2.2 еси получилось обновляете кеш 1 и 2 4. если протух кеш 1. Обновляете кеш 1 и 2. Если данные не получиось вернуть возвращаете ошибку "страница временно не доступна" --- Добавлено --- В этом случае нет ни каких вопросов кеширования. Поддключаетесь сразу к двум БД и перегоняете данные, лио обходите локальные файлы и их обрабатываете.
парсинг сторонних сайтов широко используется не только спамерами и хакерами. например надо экспортировать какието данные с сайта поставщиков, договор есть, апи есть, но оно глючное, либо неполное. приходится часть данных доставать руками,иногда эмулируя программно реального клиента, гонять куки, выполнять js, делать задержки между запросами и т.д.