Перейти к контенту

Подрезаем БД: сброс постов в файлы


Рекомендуемые сообщения

БД разрастается, форум начинает тормозить.

И самая большая таблица - ibf_posts.

Давно возникла идея для старых топиков содержимое сообщений скинуть в js-файлы, а в самой БД хранить только строки вида

<script type="text/javascript" src="archives/post123456.js"></script>

Сами js-файлы будут вида:

document.write('Текст сообщения')

 

Недостатки этого метода: сархивированные сообщения перестанут находиться внутренней поисковкой форума; по кнопке "ответить с цитатой" в форме ответа вместо цитаты текста будет "жабаскрипт".

 

Плюсы метода в том, что топики будут по-прежнему индексироваться поисковками, для посетителей форума (если не отключен джава-скрипт в браузере) внешне в топиках ничего не изменится.

 

Пробовал вручную, метод работает, но уж больно хлопотно. Решил автоматизировать процесс.

Вот, собственно, что пока сделалось:

  • Выбор сообщений топика для архивации: начиная с какого и сколько после него;
  • Предпросмотр сархивированных сообщений (без css)
  • Останов скрипта, если сообщение уже сархивировано раньше;
  • Возможность отказа от модифицирования БД после предпросмотра.

Нужно создать в форуме директорию для архивированных сообщений, выставить ей права доступа 0777. В директорию положить скрипт экспорта и запустить.

В скрипте предварительно прописать sql-сервер, имя, логин и пароль БД, префикс таблицы и путь к директории для архивов.

 

Скрипт еще "сырой", настоятельно рекомендую 7 раз проверить на локальной копии, прежде чем запускать на живом форуме.

 

 

Сам скрипт:

<?
$DB_SERVER="localhost";	//SQL-сервер
$DB_LOGIN="root";	// Логин БД
$DB_PASSWORD="";	// Пароль БД
$DB="forum";		// Имя БД
$prefix="ibf_";		// Префикс БД
$URL="";			// URL форума - заполнить, если нужно прописать абсолютный путь к скрипт-файлам.
				// Если оставить пустым, могут перестать отображаться архивированные сообщения в lofiversion

define('TIME_LIMIT', 0);
if (function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);

echo "<html><head><title>Подрезаем БД</title></head><body>";
if(!isSet($mod_key)){$mod_key='0';}

if($mod_key=='1'){
if (!($link = mysql_pconnect($DB_SERVER, $DB_LOGIN, $DB_PASSWORD)))
{
echo( sprintf( "Нет соединения С базой данных!", mysql_error() ) );
exit();
}
$query_mess= "SELECT post,pid FROM `".$prefix."posts` WHERE topic_id=".$topic." order by pid LIMIT ".$start." , ".$end;

if (!($result_mess = mysql_db_query($DB, $query_mess)))
{	echo  mysql_errno(), mysql_error();  return 0;
}
while($row_mess = mysql_fetch_array($result_mess))
{
if(is_writeable($path.$topic."/post".$row_mess['pid'].".js")){

$query= "UPDATE `".$prefix."posts` SET `post` = '<script type=\"text/javascript\" src=\"".$URL.$path.$topic."/post".$row_mess['pid'].".js\"></script>' WHERE `pid` =".$row_mess['pid']." LIMIT 1 ";
mysql_db_query($DB, $query);
echo $row_mess['pid']."... ";
}
else
{
echo "<b>".$row_mess['pid']."</b> не удалось модифицировать!<br>";
}
}
echo "<br><br>БД модифицирована.<br><br><a href='sqlexport.php'>Новый запрос</a>";
}
else
{


if(isSet($topic) and isSet($start) and isSet($path) and isSet($end) and $topic!="" and $start!="" and $end!="" and $mod_key!="1" and isSet($step)){
if($step=="0"){
$start--;
Error_Reporting(1+2+4+8);
// Connect to the Database
if (!($link = mysql_pconnect($DB_SERVER, $DB_LOGIN, $DB_PASSWORD)))
{
echo( sprintf( "Нет соединения С базой данных!", mysql_error() ) );
exit();
}
echo "<h1 align=center>Предпросмотр сообщений перед экспортом:</h1>";
$query_mess= "SELECT post,pid FROM `".$prefix."posts` WHERE topic_id=".$topic." order by pid LIMIT ".$start." , ".$end;
if (!($result_mess = mysql_db_query($DB, $query_mess)))
{	echo  mysql_errno(), mysql_error();  return 0;
}






while($row_mess = mysql_fetch_array($result_mess))
{
$testarchived=str_replace('<script type=', '', $row_mess['post']);

if($testarchived!=$row_mess['post']){
echo "<h1 align=center>Сообщение № ".$row_mess['pid']." уже экспортировано ранее или содержит скрипт!<br>Экспорт прерван.</h1>";
break;
}


echo "<center><strong>Сообщение № ".$row_mess['pid'].":</strong></center><br>";


echo $row_mess['post'];
echo '<hr>'; 
}
echo "<center><hr width='90%'><hr width='50%'><hr width='20%'>
<form action='sqlexport.php' method='get'>
<input type='hidden' name='topic' value=".$topic.">
<input type='hidden' name='start' value=".$start.">
<input type='hidden' name='end' value=".$end.">
<input type='hidden' name='path' value=".$path.">
<input type='hidden' name='mod_key' value='0'>
<input type='hidden' name='step' value='1'>
<input type='button' value='<<<Назад' onClick='history.back()'><input type=submit value='Экспортировать сообщения>>>'>
</form></center>
</center>";


}
if($step=="1"){
Error_Reporting(1+2+4+8);
// Connect to the Database
if (!($link = mysql_pconnect($DB_SERVER, $DB_LOGIN, $DB_PASSWORD)))
{
echo( sprintf( "Нет соединения С базой данных!", mysql_error() ) );
exit();
}

echo "<h1 align=center>Предпросмотр экспортированных сообщений:</h1>";

$query_mess= "SELECT post,pid FROM `".$prefix."posts` WHERE topic_id=".$topic." order by pid LIMIT ".$start." , ".$end;
if (!($result_mess = mysql_db_query($DB, $query_mess)))
{	echo  mysql_errno(), mysql_error();  return 0;
}


$paths=split("/",$path);
$path="";
while (list ($pathsq) = each ($paths))
{
$path .= $paths[$pathsq]."/";
if(!file_exists($path))mkdir($path, 0777);
}
if(!file_exists($path.$topic."/"))mkdir($path.$topic."/", 0777);


while($row_mess = mysql_fetch_array($result_mess))
{
if(is_writeable($path.$topic."/post".$row_mess['pid'].".js")){
echo "<h1 align=center>Сообщение № ".$row_mess['pid']." уже экспортировано ранее!<br>Экспорт прерван.</h1>";
break;
}
$row_mess['post'] = str_replace( "'"   , "\'", $row_mess['post']);
echo "<center><strong>Сообщение № ".$row_mess['pid'].":</strong></center><br>";

$fh = fopen($path.$topic."/post".$row_mess['pid'].".js", "w");
fwrite($fh, "document.write('<div class=\"archived\">".$row_mess['post']."</div>')");
fclose($fh);

echo "<script src='".$path.$topic."/post".$row_mess['pid'].".js' type='text/javascript'></script>";
echo '<hr>'; 
}; 
echo "<center><hr width='90%'><hr width='50%'><hr width='20%'>
<form action='sqlexport.php' method='get'>
<input type='hidden' name='topic' value=".$topic.">
<input type='hidden' name='start' value=".$start.">
<input type='hidden' name='end' value=".$end.">
<input type='hidden' name='path' value=".$path.">
<input type='hidden' name='mod_key' value='1'>
<input type=submit value='Модифицировать БД!!!'>
</form></center>
</center>";
}
}

else {
echo "<script language='JavaScript'>
function verify(){
errors = 0;
if(document.forma.path.value==''||document.forma.topic.value==''||document.forma.start.value==''||document.forma.end.value=='')
{alert('Необходимо заполнить все поля!'); errors++}
if(document.forma.path.value.substring((document.forma.path.value.length-1),document.forma.path.value.length)=='/')
{alert('Патч не должен заканчиваться слешью!'); errors++}
if(isNaN(document.forma.topic.value)||isNaN(document.forma.start.value)||isNaN(document.forma.end.value))
{alert('В описании топиков и постов допустимы только цифры!'); errors++}

if(errors>0)return false
else return true
}
</script>
<center><form name='forma' action='sqlexport.php' method='get' onsubmit='return verify()'>
Директория для экспорта:  
<input type='text' name='path' size=10 maxlength=50 value='arc'>   
<br><br>
Номер топика для экспорта:  
<input type='text' name='topic' size=6 maxlength=6>   
<br><br>
Начиная постом (номер по прядку):  
<input type='text' name='start' size=4 maxlength=4>   
<br><br>
Сколько сообщений экспортировать:  
<input type='text' name='end' size=4 maxlength=4>   
<br><br>
<input type='hidden' name='step' value='0'>
<input type=submit value='>>>'></form></center>";
}

}


echo "</body></html>";
?>

 

Если возникнет желание как-то визуально выделить сархивированные сообщения, достаточно будет через админку в css форума создать класс .archived{} и настроить его на свой вкус.

Изменено пользователем FatCat
Ссылка на комментарий
Поделиться на других сайтах

  • Ответы 99
  • Создана
  • Последний ответ

Лучшие авторы в этой теме

Лучшие авторы в этой теме

Подчистил скрипт, добавил мелкие удобности, протестировал в разных режимах.

Если специально не вводить в поля "каверзных" значений, форум не портит, архивирует аккуратно; сам создает поддиректории для js-файлов с именем по номеру топика.

 

Пример сархивированного топика здесь: сархивированы все сообщения, кроме последнего. По кнопке "цитата" можно увидеть, что на самом деле осталось в БД.

Ссылка на комментарий
Поделиться на других сайтах

Красиво. Поиск по сообщениям только становится невозможен, а так очень здорово придумано. Особенно для организации архивов.

 

Перенес в спец. форум, сконвертировал его в файлы и сидишь спокойно.

 

Попробую мод на днях, отпишусь о результатах. Актуально для больших БД более 600-800 Мб на таблицу posts с учетом индекса.

Ссылка на комментарий
Поделиться на других сайтах

А поисковики могут выполнять JS?

Гугл совершенно точно индексирует, причем не ниже по релевантности, чем php или статичный html.

Апорт, яндекс и ремблер тоже индексируют, но не знаю, как оценивают релевантность.

 

У меня на www.stenocardia.ru карта сайта сделана полностью на джава-скрипте, вынесенном в js-файл; несколько слов там уникальные (нет нигде больше на сайте) - по этим словам проверял в поисковках, сайт проиндексирован.

 

 

 

Перенес в спец. форум, сконвертировал его в файлы и сидишь спокойно.

Не обязательно переносить топик.

У меня есть топик больше 2000 сообщений за 2 года, в топике продолжается активность и поныне. Я думаю сархивировать первые 1500 сообщений, и пусть себе топик живет своей жизнью по постоянному месту проживания.

Ссылка на комментарий
Поделиться на других сайтах

у меня есть пара топиков больше 1000 сообщений за 3 месяца (игры типа опиши человека сверху) и пара больше 2500 сообщений за те-же 3 месяца (такие же игры, типа ассоциации)

так что буду очень благодарен

Ссылка на комментарий
Поделиться на других сайтах

так что буду очень благодарен

Пользуйся.

http://pharm-forum.ru/uploads/exportsql.zip

Отредактируй под себя код:

$DB_SERVER="localhost";	//SQL-сервер
$DB_LOGIN="root";	// Логин БД
$DB_PASSWORD="";	// Пароль БД
$DB="";		// Имя БД
$prefix="ibf_";		// Префикс БД

Кидаешь в корень форума, запускаешь и пользуешься.

Первый раз лучше потестировать на локальной копии.

 

Для подстраховки от ошибок скрипт работает в 3 этапа, и внесение изменений в БД происходит на последнем.

 

На первом этапе предлагается ввести:

- имя директории для хранения файлов архивированных сообщений; можно использовать длинные пути. Скрипт сам добавит в конец пути поддиректорию с именем, соответствующим номеру архивируемого топика.

- Номер экспортируемого топика.

- порядковый номер сообщения в топике, начиная с которого архивировать сообщения. Это может пригодиться для продолжения архивации. Например, если в прошлый раз сархивировал 1000 сообщений, а юзеры накидали еще 1000 новых, можно архивировать начиная с 1001-го сообщения.

- сколько сообщений архивировать. Если введенная цифра будет больше, чем число сообщений в топике, скрипт не ругнется, и сархивирует все до конца, в другие топики все равно не полезет.

 

На втором этапе создаются файлы архивов и на страницу выводятся в предпросмотр: можно посмотреть, как будут выглядеть архивированные сообщения. css не подсасывается, поэтому сообщения будут видны в предпросмотре без стилевого форматирования.

 

Третий этап - модифицирование БД; на экран выводятся ID-ы модифицированных строк таблицы ibf_posts.

 

Скриншоты:

Ссылка на комментарий
Поделиться на других сайтах

FatCat

Не понял честно говоря как он работает.

Посмотрел пример на http://www.pharm-forum.ru/index.php?showtopic=185

Обычный топик.. Чего там не так?

Я не вчитывался код, с js я не на ты )

 

 

А понял.. он при выводе постов выводит их содержимое из файлов, а содержимое постов при этом уменьшается в размере до неприличия на длину вызова скрипта. Так?

 

Если так, то вижу здесь неудобство: слишом много файлов. Хостинг гавкнет.

Они как-то группируются? По топикам, форумам?

Ссылка на комментарий
Поделиться на других сайтах

то вижу здесь неудобство: слишом много файлов. Хостинг гавкнет.

У хостеров есть лимит на количество файлов?

Никогда о таком не слышал.

Есть лимиты файловой системы: что-то порядка 20 000 файлов в одной директории для NTFS; что там у никсов - не знаю, наверное не хуже.

 

 

 

Они как-то группируются? По топикам, форумам?

Принудительно группируются по номеру топика.

 

Дополнительно можно вручную сгруппировать.

По умолчанию файлы будут записаны с директорию: ./arc/номер_топика/

Если вместно дефолтного "arc" на первом этапе ввести "archiv_1/forum_1", файлы запишутся в директорию ./archiv_1/forum_1/номер_топика/

 

Для топиков с более 20 000 сообщений очевидно потребуется архивировать по разным директориям.

 

Очень большие топики разумно будет архивировать по частям.

На локалке (intel core 2 duo 1.66 и гигабайт оперативной) модифицирование БД на 2 000 сообщений в топике заняло около 5 минут.

Ссылка на комментарий
Поделиться на других сайтах

слушай, идея

сносить из таблицы постов вообще эти записи

а в файлы архивировать всю информацию (RenderRow) целиком (автор поста, дата ну и т.д.)

естественно убираем кнопки типа изменить, цитата, ответ

удалить оставляем - удаление самого файла

 

упорядочивание будет производится с помощью какого-нибудь дат файла в той-же папке темы, содержащего ид постов

принцип его заполнения - что-то типа

$post=array(
0 => nnnnn,
1 => mmmmm,
...
);

при обращении к теме автоматически проверяем, существует ли архивный файл данных

и по результатам вводимого значения st и количества элементов в $post решаем, как выводить файлы

$this->output .= "<script src=...>";

или по всем правилам из базы

 

правда поиск по этим постам работать уже не будет, но мне и не надо чтобы искали что-то в теме ассоциации

 

 

единственный вопрос - как сделать так, чтобы в полученном яваскрипт файле использовался html, передаваемый туда из шаблонов форума (RenderRow)

если нет такой возможности, то наверно тупо сделать один стандартный RenderRowArchive, который будет использоватся для форммирования архивных файлов?

Ссылка на комментарий
Поделиться на других сайтах

2Arhar

Боюсь, сложность будет с разбивкой на страницы. И с цитированием...

У меня сейчас работает "быстрая цитата".

 

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

Ссылка на комментарий
Поделиться на других сайтах

Эх, спасибо! Боясля спросить, а теперь можно просто брать и использовать)
Ссылка на комментарий
Поделиться на других сайтах

Обнаружилась проблема: в лофи-версии архивированные сообщения не отображаются.

Это и понятно: лофи-версия работает не из корня форума, а из поддиректории.

 

У себя в 1.3 я предпочел подправить лофи-версию: добавил строку

$r['post'] = str_replace( '<script type="text/javascript" src="', '<script type="text/javascript" src="../../', $r['post'] );

 

Для тех, кто не хочет морочиться с модифицированием файлов форума, сделал возможность прописывания абсолютного пути:

<?
$DB_SERVER="localhost";	//SQL-сервер
$DB_LOGIN="root";	// Логин БД
$DB_PASSWORD="";	// Пароль БД
$DB="forum";		// Имя БД
$prefix="ibf_";		// Префикс БД
$URL="";			// URL форума - заполнить, если нужно прописать абсолютный путь к скрипт-файлам.
				// Если оставить пустым, могут перестать отображаться архивированные сообщения в lofiversion

//Дальше ничего менять не надо.
define('TIME_LIMIT', 0);
if (function_exists('set_time_limit')) set_time_limit(TIME_LIMIT);

echo "<html><head><title>Подрезаем БД</title></head><body>";
if(!isSet($mod_key)){$mod_key='0';}

if($mod_key=='1'){
if (!($link = mysql_pconnect($DB_SERVER, $DB_LOGIN, $DB_PASSWORD)))
{
echo( sprintf( "Нет соединения С базой данных!", mysql_error() ) );
exit();
}
$query_mess= "SELECT post,pid FROM `".$prefix."posts` WHERE topic_id=".$topic." order by pid LIMIT ".$start." , ".$end;

if (!($result_mess = mysql_db_query($DB, $query_mess)))
{	echo  mysql_errno(), mysql_error();  return 0;
}
while($row_mess = mysql_fetch_array($result_mess))
{
if(is_writeable($path.$topic."/post".$row_mess['pid'].".js")){

$query= "UPDATE `".$prefix."posts` SET `post` = '<script language=\"JavaScript\" type=\"text/javascript\" src=\"".$URL.$path.$topic."/post".$row_mess['pid'].".js\"></script>' WHERE `pid` =".$row_mess['pid']." LIMIT 1 ";
mysql_db_query($DB, $query);
echo $row_mess['pid']."... ";
}
else
{
echo "<b>".$row_mess['pid']."</b> не удалось модифицировать!<br>";
}
}
echo "<br><br>БД модифицирована.<br><br><a href='sqlexport.php'>Новый запрос</a>";
}
else
{

if(isSet($topic) and isSet($start) and isSet($path) and isSet($end) and $topic!="" and $start!="" and $end!="" and $mod_key!="1"){
$start--;
//$end=$start+$end;
Error_Reporting(1+2+4+8);
// Connect to the Database
if (!($link = mysql_pconnect($DB_SERVER, $DB_LOGIN, $DB_PASSWORD)))
{
echo( sprintf( "Нет соединения С базой данных!", mysql_error() ) );
exit();
};


echo "<h1 align=center>Предпросмотр экспортированных сообщений:</h1>";

$query_mess= "SELECT post,pid FROM `".$prefix."posts` WHERE topic_id=".$topic." order by pid LIMIT ".$start." , ".$end;
if (!($result_mess = mysql_db_query($DB, $query_mess)))
{	echo  mysql_errno(), mysql_error();  return 0;
}


$paths=split("/",$path);
$path="";
while (list ($pathsq) = each ($paths))
{
$path .= $paths[$pathsq]."/";
if(!file_exists($path))mkdir($path, 0777);
}
if(!file_exists($path.$topic."/"))mkdir($path.$topic."/", 0777);


while($row_mess = mysql_fetch_array($result_mess))
{
if(is_writeable($path.$topic."/post".$row_mess['pid'].".js")){
echo "<h1 align=center>Сообщение № ".$row_mess['pid']." уже экспортировано ранее!<br>Экспорт прерван.</h1>";
break;
}
$row_mess['post'] = str_replace( "'"   , "\'", $row_mess['post']);
echo "<center><strong>Сообщение № ".$row_mess['pid'].":</strong></center><br>";

$fh = fopen($path.$topic."/post".$row_mess['pid'].".js", "w");
fwrite($fh, "document.write('<div class=\"archived\">".$row_mess['post']."</div>')");
fclose($fh);

echo "<script src='".$path.$topic."/post".$row_mess['pid'].".js' type='text/javascript'></script>";
echo '<hr>'; 
}; 
echo "<center><hr width='90%'><hr width='50%'><hr width='20%'>
<form action='sqlexport.php' method='get'>
<input type='hidden' name='topic' value=".$topic.">
<input type='hidden' name='start' value=".$start.">
<input type='hidden' name='end' value=".$end.">
<input type='hidden' name='path' value=".$path.">
<input type='hidden' name='mod_key' value='1'>
<input type=submit value='Модифицировать БД!!!'>
</form></center>
</center>";
}

else {
echo "<script language='JavaScript'>
function verify(){
errors = 0;
if(document.forma.path.value==''||document.forma.topic.value==''||document.forma.start.value==''||document.forma.end.value=='')
{alert('Необходимо заполнить все поля!'); errors++}
if(document.forma.path.value.substring((document.forma.path.value.length-1),document.forma.path.value.length)=='/')
{alert('Патч не должен заканчиваться слешью!'); errors++}
if(isNaN(document.forma.topic.value)||isNaN(document.forma.start.value)||isNaN(document.forma.end.value))
{alert('В описании топиков и постов допустимы только цифры!'); errors++}

if(errors>0)return false
else return true
}
</script>
<center><form name='forma' action='sqlexport.php' method='get' onsubmit='return verify()'>
Директория для экспорта:  
<input type='text' name='path' size=10 maxlength=50 value='arc'>   
<br><br>
Номер топика для экспорта:  
<input type='text' name='topic' size=6 maxlength=6>   
<br><br>
Начиная постом (номер по прядку):  
<input type='text' name='start' size=4 maxlength=4>   
<br><br>
Сколько сообщений экспортировать:  
<input type='text' name='end' size=4 maxlength=4>   
<br><br>
<input type=submit value='>>>'></form></center>";
}

}


echo "</body></html>";
?>

Ссылка на комментарий
Поделиться на других сайтах

а цитирование разве работает?

там же скриптовый текст при попытке цитирования..

Работает "быстрое цитирование" джаваскриптом в форму быстрого ответа.

Ссылка на комментарий
Поделиться на других сайтах

Получается, что на глаз нельзя даже отличить архивированый топик от топика, который остался в базе данных форума?

А редактировать такие сообщения, я так понимаю нельзя?

Ссылка на комментарий
Поделиться на других сайтах

Получается, что на глаз нельзя даже отличить архивированый топик от топика, который остался в базе данных форума?

fwrite($fh, "document.write('<div class=\"archived\">".$row_mess['post']."</div>')");

В админке открываешь редактирование стилей и описываешь класс .archived по своему усмотрению.

 

 

 

А редактировать такие сообщения, я так понимаю нельзя?

Редактировать старые архивы? Месье знает толк в извращениях! :D

 

В принципе нет ничего сложного сделать функцию редактирования содержимого js-файла. Но не вижу нужды делать.

 

 

Что планирую сделать - это двойной предпросмотр: первый из БД без экспорта в файлы, второй предпросмотр для экспортированных файлов.

 

Что уже сделал у себя - вызов скрипта архивации прямо из топика для архивации отдельных сообщений по выбору; при этом у сархивированных сообщений кнопка архивации перестает отображаться. Кнопка архивации видна только админам и модераторам, да и сам архиватор защитил от доступа через .httaccess...

Ссылка на комментарий
Поделиться на других сайтах

Что планирую сделать - это двойной предпросмотр: первый из БД без экспорта в файлы, второй предпросмотр для экспортированных файлов.

Сделано.

Заодно сделана двойная проверка, не совершается ли экспорт повторно. Проверяется не только наличие js-файла, но и наличие кода линка скрипта в ячейке БД.

 

Первое сообщение обновил.

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

FatCat, а на сколько директорий надо разделить, предположим, топик с 30 000 - 40 000 сообщениями?

dayw, да. Выше даже пример в скринах приводился.

Ссылка на комментарий
Поделиться на других сайтах

FatCat, а на сколько директорий надо разделить, предположим, топик с 30 000 - 40 000 сообщениями?

Насколько я знаю, лимит файловой системы порядка 20 000 файлов в одной директории. Я бы для перестраховки разбил по 10 000 на директорию.

Ссылка на комментарий
Поделиться на других сайтах

А сколько примерно времени занимает сархивирование 10 000 сообщений?

Я не пробовал больше 300 за раз.

300 сообщений сбрасывает в файлы секунд за 10 и примерно столько же времени на модификацию БД.

Наверное это зависит и от компьютера хостера. У меня форум на www.orc.ru

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.