VBsupport перешел с домена .ORG на родной .RU
Ура!
Пожалуйста, обновите свои закладки - VBsupport.ru
Блок РКН снят, форум доступен на всей территории России, включая новые терртории, без VPN
На форуме введена премодерация ВСЕХ новых пользователей
Почта с временных сервисов, типа mailinator.com, gawab.com и/или прочих, которые предоставляют временный почтовый ящик без регистрации и/или почтовый ящик для рассылки спама, отслеживается и блокируется, а так же заносится в спам-блок форума, аккаунты удаляются
Если вы хотите приобрести какой то скрипт/продукт/хак из каталогов перечисленных ниже: Каталог модулей/хаков
Ещё раз обращаем Ваше внимание: всё, что Вы скачиваете и устанавливаете на свой форум, Вы устанавливаете исключительно на свой страх и риск.
Сообщество vBSupport'а физически не в состоянии проверять все стили, хаки и нули, выкладываемые пользователями.
Помните: безопасность Вашего проекта - Ваша забота. Убедительная просьба: при обнаружении уязвимостей или сомнительных кодов обязательно отписывайтесь в теме хака/стиля
Спасибо за понимание
Общеизвестно, что создать собственную страницу с использованием шаблонов форума и собственным контентом внутри очень несложно. Именно эта несложность натолкнула меня на написание некоего простого по самое не могу, но исправно работающего граббера контента с других сайтов. В бОльшей степени меня интересуют словари и энциклопедии. Сетевых и так хватает, а прогонять по ним граббер и пихать все в собственную многострадальную базу неохота совсем.
Итак, как оно работает. При вызове собственной страницы, в URL которой в качестве параметров указаны номер (условный) сайта, с которого брать информацию и другая необходимая инфа, скрипт скачивает эту страницу, потом идет очистка ее с помощью preg_replace от всякого хлама и тонн рекламы, потом , при необходимости, iconv - и вуаля, вот оно, все из себя красивое.
Gostemilov, Немного не понятно, что ты хочешь кэшировать?
Давай по порядку.
Ты делаешь собственную страницу например с адресом tvoysayt/tvoyastranitsa.php?do=main
В скрипте грабер на контент с другого ресурса
При первом вызове страницы происходит парсинг внешнего ресурса
Полученное содержание сохраняется в бд
Во второй заход на страницу грабинг уже не происходит, а берется представление из БД
Соответственно что грабинг и сохранение происходит для этого скрипта с каждым уникальным набором параметров url
На сколько я понимаю, что ты хочешь сделать например бб код толкового словаря но не на внешний ресурс, а на свой например tvoysayt/tvoyastranitsa.php?do=dict&words=твои+искомые+слова
При первом переходе, будет происходить поиск во внешнем ресурсе и выводиться у тебя. Результат будет сохранен в бд и когда второй раз будет переход по такой же ссылке, то результат будет выведен без парсинга.
Если это то что ты хочешь, то это не сложно ты должен сделать несколько вещей
Создать в бд таблицу с индексом в виде md5 хэша твоего запроса, полем longtext для хранения содержания, полем lastupdate для хранения времени последнего обновления
При исполнении скрипта твоей страницы тебе необходимо составить массив значений md5 хэша, перевести текущий запрос в md5 хэш и проверить наличие в бд сохраненных представлений
Если представление есть и оно не позже некой гипотетической даты устаревания, то делается запрос на выборку по md5 хэш и выводится на странице
Если данные устарели или отсутствуют в бд то они парсятся и вносятся в бд с помощью REPLACE (это и инсерт и упдейт одновременно)
В общем то это все.
Если ты имел ввиду что то другое, то расскажи.
@Gostemilov
Специалист
Join Date: Jun 2007
Location: Одинцово Московская область
Награды в конкурсах:
Posts: 610
Версия vB: 3.8.4
Reputation:
Professional 630
Репутация в разделе: 495
0
При парсинге данных с другого ресурса БД не используется вообще и данные в нее не заносятся.
И после этого $imported_content банально выводится на странице. Нет использования БД, но есть HTML страница которую хотелось бы закешировать с целью снижения входящего траффика и нагрузки на сервер. Я ж говорил, все просто до не могу
@SMak044
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1707
Репутация в разделе: 1192
0
Quote:
Originally Posted by Gostemilov
И после этого $imported_content банально выводится на странице. Нет использования БД, но есть HTML страница которую хотелось бы закешировать с целью снижения входящего траффика и нагрузки на сервер. Я ж говорил, все просто до не могу
И на долго ты будешь кэшировать этот конкретный объект... Любой новый пользователь зашедьший на эту же страницу, должен будет получить свою версию страницы, а это значит, что должен быть выполнен парсинг. При этом браузер у пользователя сам кэширует содержание, зачем тебе туда влазить...
У нас не понимание в определении термина кэширование. Вот скажи мне пожалуйста как сформированная страница в одной сессии первого пользования, может попасть без использования бд в сессию другого пользователя... Лично я такого способа не знаю, хотя я и не последняя инстанция.
В общем без бд тут не обойдешься, даже в самой булке сообщения прошедьшие парсинг бб кодов хранятся в отдельной таблице в явном виде (уже в html)? что бы не парсить бб коды каждый раз.
@Gostemilov
Специалист
Join Date: Jun 2007
Location: Одинцово Московская область
Награды в конкурсах:
Posts: 610
Версия vB: 3.8.4
Reputation:
Professional 630
Репутация в разделе: 495
0
Нет, ну смотри - содержание страниц статично и не меняется годами. То есть смысл по 1000 раз на дню тянуть один и тот же контент отстутствует. Я не случайно упомянул, что речь идет о словарях и энциклопедиях, а не о динамическом контенте. Нет, загнать это все в базу можно, но зачем? Не проще как-то сохранить как HTML (или в подобном виде) и при повторном запросе тупо обрабатывать в 1 обращение апача? Я так думаю, мне так кажется...
kerk
k0t
Join Date: May 2005
Location: localhost
Posts: 28,823
Версия vB: 3.8.x
Пол:
Reputation:
Гуру 20319
Репутация в разделе: 8468
0
Quote:
Originally Posted by Gostemilov
Не проще как-то сохранить как HTML (или в подобном виде)
проще конечно, можно сохранять страницу как файл
но в этом случае придется каждый разобращаться к файловой системе
сама страница, где выводятся данные, динамическая же, так?
при запросе какого то контента, в ссылке передаются аргументы, что именно нужно, вот и передавать в аргументе, какое то значение, которое и будет определять сохраненную страницу
в своем скрипте естессно сначала опрашивать ФС, а есть ли уже копия, сохраненная у нас?
и если нет, то парсить удаленную страницу
@SMak044
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1707
Репутация в разделе: 1192
0
Quote:
Originally Posted by Gostemilov
Нет, ну смотри - содержание страниц статично и не меняется годами. То есть смысл по 1000 раз на дню тянуть один и тот же контент отстутствует. Я не случайно упомянул, что речь идет о словарях и энциклопедиях, а не о динамическом контенте. Нет, загнать это все в базу можно, но зачем? Не проще как-то сохранить как HTML (или в подобном виде) и при повторном запросе тупо обрабатывать в 1 обращение апача? Я так думаю, мне так кажется...
то есть в момент создания своего собственного представления после парсинга, ты хочешь создавать на диске файл....
То есть если я в поиске слова вобью "взбрыкнуть", то по идее у тебя на диске должен создаться файл взбрыкнуть.html именно в кириллице и таких файлов у тебя через пол года будет пару тысяч в одном каталоге, а то и больше.... потому что есть еще и словосочетания и фразы и ошибки поиска...
Ну конечно можно и транслит прикрутить, что бы не кириллица... но вот что делать со словом пост и post.... транслит не подойдет... конечно можно таки переводить в md5 и хранить файлы типа md5hash.html но тогда тебе надо все же будет проводить какие то операции с получением md5 хэша, а это не одно обращение к апачу.
С другой стороны 1 запрос к бд на выборку по тому же md5 хешу запроса или выдаст тебе готовый html код или нет и тогда будет сделан запрос на внешний ресурс и значение будет сохранено. если результатов не будет, то ты не будешь выводить пользователю страницу с ошибкой, а можешь использовать и другой внешний ресурс или поставить свою заглушку.
Заметь, что запрос будет на выборку по уникальной записи md5 хэша, то есть скорость выполнения такого запроса будет очень мала и объем данных будет очень маленьким...
Хотя конечно можно сделать все через файлы но мне почему то всегда казалось, что работа через файлы занимает больше времени и больше ресурсов.
@Gostemilov
Специалист
Join Date: Jun 2007
Location: Одинцово Московская область
Награды в конкурсах:
Posts: 610
Версия vB: 3.8.4
Reputation:
Professional 630
Репутация в разделе: 495
0
А при чем тут вообще поиск? Я еще раз внимательно посмотрел и никакого поиска кроме штатного по сатй у себя не обнаружил. Это контент для СЕО, в общем-то, и не более того. А вот теперь представьте себе размер базы, если я в нее положу с десяток (это если по скромному) энкцилопедий и пару словарей по 500К значений каждый. И еще Либрусек впридачу (кстати, импорт контента с Либрусека я прикрутил) И что будет? Терабайт? Тут ужен нужны решения с распределенными кластерами БД, а я человек скромный и делаю тоже по-скромному
Вот и выходит, что это filecache или вообще ничего
Gostemilov добавил 27.07.2012 в 16:47
Quote:
проще конечно, можно сохранять страницу как файл
но в этом случае придется каждый разобращаться к файловой системе
сама страница, где выводятся данные, динамическая же, так?
при запросе какого то контента, в ссылке передаются аргументы, что именно нужно, вот и передавать в аргументе, какое то значение, которое и будет определять сохраненную страницу
в своем скрипте естессно сначала опрашивать ФС, а есть ли уже копия, сохраненная у нас?
и если нет, то парсить удаленную страницу
- именно так. А поскольку я, как известно, никогда не кладу все файлы в одну корзину - еще и структурировать по системе каталогов, то есть в одном каталоге файлы, относящиеся к одному ресурсу (или, если их ну очень много - еще какое-то деление) и т.д. И не будет бешеной нагрузки на ФС при опросе - есть ли это имя файла среди стопицоттыщ подобных
Last edited by Gostemilov : 07-27-2012 at 05:47 PM.
Reason: Добавлено сообщение
@SMak044
Эксперт
Join Date: May 2008
Награды в конкурсах:
Posts: 1,764
Версия vB: 3.8.4
Пол:
Reputation:
Expert 1707
Репутация в разделе: 1192
0
Gostemilov, Ну тут можно объединить 2 метода... Дума так будет правильнее всего.
Мы все же делаем табличку в бд например mylib и делаем там такие поля
md5hash(VCH255), nativequery(VCH255), libname(VCH255), lastupdate(INT11)
Делаем каталоги для библиотек
При получении запроса делаем запрос к БД. Если есть берем каталог нужной библиотеки и забираем там файл с именем md5hash. Если такого файла нет, то парсим содержание и сохраняем результат под именем md5hash нашего запроса и заносим запись в БД.
Как результат нет поиска по файлам и таблица в БД будет не тяжелой и нет еще проблемы с русскими именами файлов, транслитом и фразами в запросах.
Все же рекомендую предусмотреть периодическое обновление файлов по устареванию, это не будет лишним. просто устаревание может быть и год и пол года и месяц, это просто настройка и все.
Так думаю скрипт будет работать быстрее всего и нагрузка будет наиболее маленькая.
@Gostemilov
Специалист
Join Date: Jun 2007
Location: Одинцово Московская область
Награды в конкурсах:
Posts: 610
Версия vB: 3.8.4
Reputation:
Professional 630
Репутация в разделе: 495
0
Это оно! Именно то, что мне нужно. Минимальный размер базы, учет обновлений и парсинг только отсутствующего. Пошел кодить, хоть и кодер из меня - ну даже до индусов мне далеко