С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 431
1

Нужен совет по использованию bbcode

23.05.2016, 08:48. Просмотров 168. Ответов 6
Метки нет (Все метки)

Здравствуйте. Есть такой вопрос.
Существует ресурс, с выводом списка новостей. Администратор ресурса создает новости средствами wysibb редактора.
Далее, при просмотре статей, нужно выводить отпарсенный bbcode.
Вот тут и назревает главный вопрос.
Если хранить в БД только текст с bbcode, то при выводе списка требуется каждую новость в цикле парсить. При большом кол-ве человек на ресурсе 5000-6000, такое действие создает нехилую нагрузку на сервер. Сейчас стал кэшировать страницы, но это неудобно, так как кэшированная страница отдается всем пользователям одинаковая, а нужно иногда кого-то ограничить, т.е отображать неполный список новостей.

Отсюда появилась мысль. А что если, при создании новости заносить в БД и данные с bbcode и данные отпарсенные после редактирования и соответственно выводить в редактор одно, а на страницу выводить другое? Но насколько безопасно хранить html в БД и как это лучше все организовать, дабы получить безопасное хранение и вывод данных?
Пользовательские комментарии тоже сделаны на основе bbcode. По этому хочется организовать все это безопасно. Помогите советом, кто и как делает и как лучше это организовать?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2016, 08:48
Ответы с готовыми решениями:

Нужен совет
Здравствуйте! Буду краток :) Есть маленькая html страничка и формочка на ней:...

Нужен совет
Есть скрипт добавление фоток. При первом добавлении все нормально дальше если...

Совет нужен
Вообщем затеял написать игрушку какую нибудь онлайн, Типо как в вк Wormix что...

Совет нужен!
Добрый день!! Искал по инету готовый модль для проведения тестирования...

нужен совет
Здравствуйте В этом году нужно делать дипломный проект сейчас уже надо...

6
insideone
Модератор
Автор FAQ
3660 / 940 / 112
Регистрация: 10.01.2010
Сообщений: 2,527
23.05.2016, 20:20 2
Хранить в кеше не страницу, а отдельную запись
0
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 431
24.05.2016, 07:35  [ТС] 3
Хорошо, но если учесть что на ресурсе 25 записей на страницу, а страниц 2100 и это только пока, то получается что в кэше может быть до 52 500 файлов и как будет работать сервер при формировании страницы?

Просто можно же хранить не именно html теги, как я написал, а
PHP
1
htmlspecialchars($_POST['text']);
а при выводе
PHP
1
 $Rows['text']=html_entity_decode($Rows['text']);
или не стоит?
В данном варианте меня не устраивает то, что нужно содержать несколько полей, да и работа с html тегами, почти напрямую. Не хотелось бы.
Но с кэш тоже может оказаться для сервера проблематично, при таком объеме файлов формировать конечную страницу
0
insideone
Модератор
Автор FAQ
3660 / 940 / 112
Регистрация: 10.01.2010
Сообщений: 2,527
25.05.2016, 00:59 4
Цитата Сообщение от MirDj Посмотреть сообщение
и как будет работать сервер при формировании страницы?
Прикрутить SSD и радоваться жизни

Цитата Сообщение от MirDj Посмотреть сообщение
Хорошо, но если учесть что на ресурсе 25 записей на страницу, а страниц 2100
Я очень сомневаюсь что у каждого пользователя страница уникальная. Соответственно ключём к кешу может служить хеш от списка ID отображаемых статей

Цитата Сообщение от MirDj Посмотреть сообщение
Но насколько безопасно хранить html в БД
В общем-то безопасно, но таблицы будут пухнуть. htmlspecialchars я бы не стал делать, лишняя работа
Ещё вынес бы это вообще в отдельную таблицу и всегда доставал это отдельным запросом
Если что-то начнёт тормозить из-за этой таблицы всегда можно почистить, главное предусмотреть что если в БД записи нет - то надо её генерить и сохранять
0
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 431
25.05.2016, 14:54  [ТС] 5
С ssd серваки очень дорого выходят! Наверное при отсутствии возможности поставить ssd лучше отказаться от кэширования?

htmlspecialchars я бы не стал делать, лишняя работа
Так как же тогда? Прямо html теги заносить? Так ведь это опасно. Начнут всякие скрипты вставлять или еще чего.

Я очень сомневаюсь что у каждого пользователя страница уникальная. Соответственно ключём к кешу может служить хеш от списка ID отображаемых статей
Не у каждого конечно, но, например у забаненого пользователя или не авторизованного пользователя может список статей отличатся.

Ну и уж коли мы говорили про кэш. Правильный ли метод я выбрал?
По сути делаю так:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$cache_time = 300;
$cache_read=false;
 
$page - номер страницы в пагинаторе
 
$newsLast_sql = $sql->query("select id from `".MY_PREFIX."_news` where public='0' order by id DESC limit 1");
$cn = $newsLast_sql->fetch();
$newsLast = $cn['id']; - это самая последняя запись на текущий момент в БД
 
 
  if (file_exists('cache/newsall_'.$page.'_'.$newsLast.'.cache')){ // Если кэш файл существует
 
   if ((time() - $cache_time) < filemtime('cache/newsall_'.$page.'_'.$newsLast.'.cache')) { // Если время существования файла не истекло
   $cache_read=true;
   readfile('cache/newsall_'.$page.'_'.$newsLast.'.cache'); // Читаем кэш файл
   } else{  // Если время истекло, файл удаляем и даем команду генерировать страницу
    $cache_read=false;
   unlink ('cache/newsall_'.$page.'_'.$newsLast.'.cache');
   }
 
 }
 
 if(!$cache_read){
 ob_start();
потом обработчик с выборкой новостей из БД
ну и в конце

PHP
1
2
3
4
5
6
}
   $buffer = ob_get_contents();
ob_end_flush();
$fp = fopen('cache/newsall_'.$page.'_'.$newsLast.'.cache', 'w');
fwrite($fp, $buffer);
fclose($fp); }
Я понял что мне было предложено кэшировать каждую новость, а не весь вывод, но сейчас вопрос в том, что правильный ли способ кэширования вообще? Или есть другой какой-то более правильный и хороший способ?
0
insideone
Модератор
Автор FAQ
3660 / 940 / 112
Регистрация: 10.01.2010
Сообщений: 2,527
25.05.2016, 23:57 6
Цитата Сообщение от MirDj Посмотреть сообщение
Прямо html теги заносить? Так ведь это опасно. Начнут всякие скрипты вставлять или еще чего.
Чем опасно? Это дело парсера bbcode чтобы на выходе был безопасный html

Цитата Сообщение от MirDj Посмотреть сообщение
Ну и уж коли мы говорили про кэш. Правильный ли метод я выбрал?
Вполне нормально. Лучше конечно готовые решения использовать, но если времени изучать это нет или хочется именно потренироваться...

Вместо такой склейки newsall_'.$page.'_'.$newsLast я бы собрал массив всех параметров от которых зависит кеш и взял бы от него sha1(var_export($str)), вот и имя файла уникальное. В таком случае очень просто доп. параметры добавлять - просто в массив ещё один элемент и все
0
MirDj
2 / 2 / 2
Регистрация: 16.01.2013
Сообщений: 431
26.05.2016, 08:04  [ТС] 7
А то что мне внутри цикла придется создавать кэш для каждой новости в отдельности это не сильно будет давать нагрузку? Ведь что создать одну страницу целиком и что создавать 25 новостей, а потом еще сортировать их по выводу. Что-то из БД, чего еще нет в кэш, а что-то соответственно из кэш. Уже несколько дней прошло, но так и не могу выбрать оптимальный вариант. Хочется сделать и безопасно и с наименьшими переделками, ну и естественно нагрузка на сервер и скорость работы сайта чтобы были оптимальными.
существует несколько вариантов реализации, что я для себя отметил, возможно есть другие, но я о них не догадываюсь:

1. Просто использовать Bbcode, чистый, без кэш.
+ Простота кода, в плане реализации и удобно что-то внедрять и контролировать каждую новость.
- Парсер внутри цикла создает большую нагрузку на сервер.

2. Bbcode+кэш полной страницы.
+ Уменьшенная нагрузка на сервер, загрузка быстрее.
- Невозможность сортировать новости отдельно для каждого пользователя и контролировать их вывод.

3. Bbcode+кэш каждой новости.
+ Можно сортировать новости для каждого пользователя отдельно и ограничивать вывод.
- Вероятно, что на обычном hdd сервера (массив из 4 дисков по 500 Гб) будет медленная отдача файла. Пока он его найдет среди кучи кэш+файлы медиа тоже с диска в новости подгружаются.

4. Bbcode для редактирования+html для вывода.
+ простота вывода, быстрая работа относительно парсинга bbcode налету. Можно все данные контролировать и менять.
- Создавать отдельную таблицу с html новостями и комментариями(клонирование таблицы, фактически), исключительно для вывода. Вторя таблица такая же, но исключительно для редактирования. Как мне кажется самая усложненная реализация. Ну и работать напрямую с html тегами не очень бы хотелось.
0
26.05.2016, 08:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2016, 08:04

Нужен совет
Здравствуйте. Не могли вы посоветовать мне какую-то идею для дипломной работы....

Нужен технический совет
Здравствуйте, может быть вопрос не в той теме, но не знаю куда обратиться,...

Нужен совет бывалых
Здравствуйте! Меня зовут Александр. В этом году я закончил институт по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru