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

[1.x.x]Smile Auto-Fix


d1pro

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

Название: Smile Auto-Fix

Добавил: d1pro

Добавлен: 03 Авг 2003

Обновлен: 03 Авг 2003

Категория: IP.Board 1.x.x

 

Автоматическое обновление смайлов

Автор: d1 (d1pro@yandex.ru)

Благодарности за помощь: theIggs, Vanish

Последнее обновление: 3.08.2003

 

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

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

На всякий случай крайне рекомендуется сделать back-up вашей базы.

 

Скрипт так же отображает ход выполнения. Если 30 секунд не достаточно для обработки базы (появляется соответствующая ошибка), раскомментируйте вторую строчку скрипта (сразу после "<?php").

 

Скрипт тестировался на версиях 1.1.2 и 1.2 RC2.

 

Небольшой багофикс, который абсолютно не имел отношения к функциям скрипта http://www.ibresource.ru/forums/html/emoticons/wink_3.gif

Модификация была обновлена 3.8.2003, 23:35

Модификация была обновлена 20.8.2003, 5:05

Модификация была обновлена 20.8.2003, 5:06

 

Нажмите здесь, чтобы скачать файл

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

То что мне нужно. А то у меня пол базы с левыми ссылками на смайлы. Только вот есть 1 трабл:

 

 

Fatal error: Maximum execution time of 30 seconds exceeded in c:\apache\htdocs\new2\sources\Drivers\mySQL.php on line 189

 

 

У меня база 70 метров :D Придумайте чтонить

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

Total

Все, немного обновил, оптимизировал (а то оно тысячи запросов делало, теперь порядок). Если времени не хватает - надо раскомментировать указанную строчку. Теоретически за конечное время выполнит :D

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

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

Начало обработки

Иницализация таблицы смайлов...

Смайлы инициализированы. 90 запросов проведено

Обработка постов

Обработано: 500 из 130408

...................................................

 

Прошло все успешно. ОГРОМНОЕ СПАСИБО. А можно сделать примерно тоже самое для ЦИТАТ. У меня раньше был другой вид цитаты, и на половине форума он так и остался, а то не красиво как-то :D

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

Total

Так он все 130408 просмотрел?

Может тогда сделать скрипт для пересборки сообщений полностью? Т.е. все сообщения будут разобраны на код и собраны вновь. Правда времени это займет больше (в смысле процесс обработки).

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

Total

Ну можно по разному сделать. Можно сделать чтобы он пересобирал все тэги, зарегестировнные на форуме (т.е. даже те, что хаками добавлены),однако это будет слегка не оптимально и может временно положить сервер :D (по крайней мере я так полагаю). Можно сделать оптимизировано, но только специфические тэги. Что нужно? Хотя наверно сделаю оба варианта...

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

Total

В общем все оказалось не так сложно, как казалось :D, да и сервер вроде падать не будет. Вот этот скрипт разбирает, а за тем снова собирает все посты в темах, основываясь на настройках форумов (разрешения на IBCode, на HTML, перерабатываются смайлы, заново обрабатываются все используемые тэги). Надеюсь он делает все правильно, но лучше всего сделать бэк-ап базы (так сказать использование только на свой страх и риск).

Если не страшно (все же лучше сделать бэк-ап), то попробуй - использование такое же, как и у Smile Auto-Fix. Если поможет, то добавлю в архив.

 

<?php
//set_time_limit(0); //раскомментировать только в случае нехватки времени на обработку всей базы

$root_path = "./";

error_reporting  (E_ERROR | E_WARNING | E_PARSE);
set_magic_quotes_runtime(0);

class Debug {
   function startTimer() {
       global $starttime;
       $mtime = microtime ();
       $mtime = explode (' ', $mtime);
       $mtime = $mtime[1] + $mtime[0];
       $starttime = $mtime;
   }
   function endTimer() {
       global $starttime;
       $mtime = microtime ();
       $mtime = explode (' ', $mtime);
       $mtime = $mtime[1] + $mtime[0];
       $endtime = $mtime;
       $totaltime = round (($endtime - $starttime), 5);
       return $totaltime;
   }
}

class info {

var $member     = array();
var $input      = array();
var $session_id = "";
var $base_url   = "";
var $vars       = "";
var $skin_id    = "0";     // Skin Dir name
var $skin_rid   = "";      // Real skin id (numerical only)
var $lang_id    = "en";
var $skin       = "";
var $lang       = "";
var $server_load = 0;
var $version    = "v1.1.2";
var $lastclick  = "";
var $location   = "";
var $debug_html = "";

function info() {
 global $sess, $std, $DB, $root_path, $INFO;

 $this->vars = &$INFO;

 $this->vars['TEAM_ICON_URL']   = $INFO['html_url'] . '/team_icons';
 $this->vars['AVATARS_URL']     = $INFO['html_url'] . '/avatars';
 $this->vars['EMOTICONS_URL']   = $INFO['html_url'] . '/emoticons';
 $this->vars['mime_img']        = $INFO['html_url'] . '/mime_types';

}
}

//класс для пересборки

class remount {
var $forums      = "";

   function init_remount()
   {
       global $DB;
       echo "Инициализация разрешений форумов...<br>";
       flush();
       $DB->query("SELECT id, use_ibc, use_html from ibf_forums");
       $i = 1;
       $this->forums = array();
    if ( $DB->get_num_rows() )
    {
        while ( $r = $DB->fetch_row() )
        {
            $this->forums[$r['id']] = array( 'use_ibc'     => stripslashes($r['use_ibc']),
                                        'use_html'     => stripslashes($r['use_html']),
                                      );
         $i++;
        }
    }
  	 echo "Форумы инициализированы. ".$i." входов найдено.<br>";
       flush();
   }

   function remount_post ($txt, $emo, $fid)
{
    global $parser;
 $txt = $parser->unconvert($txt);
       $txt = $parser->convert(array('TEXT'=>$txt, 'SMILIES'=>$emo, 'CODE'=>$this->forums[$fid]['use_ibc'], 'SIGNATURE'=>0, 'HTML'=>$this->forums[$fid]['use_html'] ));
    return $txt;
}

   function remount_message ($txt)
{
    global $parser;
 $txt = $parser->unconvert($txt);
       $txt = $parser->convert(array('TEXT'=>$txt, 'SMILIES' => 1, 'CODE' => 1, 'SIGNATURE' => 0, 'HTML' => 0));
    return $txt;
}

}


require $root_path."conf_global.php";

$Debug = new Debug;

$INFO['sql_driver'] = !$INFO['sql_driver'] ? 'mySQL' : $INFO['sql_driver'];

$to_require = $root_path."sources/Drivers/".$INFO['sql_driver'].".php";
require ($to_require);

$DB = new db_driver;

$DB->obj['sql_database']     = $INFO['sql_database'];
$DB->obj['sql_user']         = $INFO['sql_user'];
$DB->obj['sql_pass']         = $INFO['sql_pass'];
$DB->obj['sql_host']         = $INFO['sql_host'];
$DB->obj['sql_tbl_prefix']   = $INFO['sql_tbl_prefix'];

$DB->obj['debug']            = ($INFO['sql_debug'] == 1) ? $_GET['debug'] : 0;
//---------------------------

$ibforums             = new info();

$Debug->startTimer();

$DB->connect();

echo "Начало обработки<br>";
flush();

require $root_path."sources/lib/post_parser.php";

$parser = new post_parser;
$parser->post_parser();
$remount= new remount;
$remount->init_remount();
$query = $DB->query("SELECT pid, use_emo, post, forum_id FROM ibf_posts WHERE 1");
$i = 0;
$j = $DB->get_num_rows();
echo "Обработка постов<br>";
flush();
while ($row = $DB->fetch_row($query))
{
   $row['post'] = $remount->remount_post($row['post'], $row['use_emo'], $row['forum_id']);
   $DB->query('UPDATE ibf_posts SET post = "'.addslashes($row['post']).'" WHERE pid = '.$row['pid']);
$i++;
   if ($i % 500 == 0 )
   {
  	 echo "Обработано: ".$i." из ".$j."<br>";
  	 flush();
   }
}
echo "Постов обработано: ".$i."<br>";
flush();
$query = $DB->query("SELECT msg_id, message FROM ibf_messages WHERE 1");
$i = 0;
$j = $DB->get_num_rows();
echo "Обработка PM<br>";
flush();
while ($row = $DB->fetch_row($query))
{
$row['message'] = $remount->remount_message($row['message']);
$DB->query('UPDATE ibf_messages SET message = "'.addslashes($row['message']).'" WHERE msg_id = '.$row['msg_id']);
$i++;
   if ($i % 500 == 0 )
   {
  	 echo "Обработано: ".$i." из ".$j."<br>";
  	 flush();
   }
}
echo "Сообшений обработано: ".$i."<br>";
echo "Проведено запросов ".$DB->get_query_cnt()."<br>";
echo "Скрипт исполнялся ".$Debug->endTimer().".<br>";

$DB->close_db();

echo "Обновление базы завершено<br>";


?>

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

Ок - сегодня вечером на локалке прогоню его, если все будет нормально то и на форуме. Насчет хтмл. У меня стоит что толькоя могу его использовать. Не будет с этим траблов?
Ссылка на комментарий
Поделиться на других сайтах

Ого - багу нашел :D У меня база выросла на 3 метра после этого апгрейда.

Я полез смотреть и обнаружил что пост выглядит так:

                  А мне-то как раз тоже не сладко.. Скоро уже экзамены по вождению. Нервы тратить только... Блин, не никакого желания учится, а с другой стороны заняться-то всё равно нечем. Вот<!--emo&:)--><img src='http://www.ruforum.net/html/emoticons/smile.gif' border='0' style='vertical-align:middle' alt='smile.gif'><!--endemo-->                  

Тоесть он имеет 18 пустых символов в начале и в конце. Того 36 символов с каждого поста * 130700 = 4705200 символов ПУСТЫХ всего. Что и состовляет примерно 4.5 мега места ;) Но что самое удивительное это не во всей базе, а только где-то до половины. В оставшейся половине только по 1 символу вначале и в конце пыстых (но это вроде нужно так). Так вот как мне убрать эти 18 символов вначале и конце и оставить только по 1 ?? ХЕЛП

 

ЗЗЫ. А символы эти были вроде и до апгрейда этим скриптом, тогда за счет чего база могла вырости на 3 метра??

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

Total

Насчет хтмл. У меня стоит что толькоя могу его использовать. Не будет с этим траблов?

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

ЗЗЫ. А символы эти были вроде и до апгрейда этим скриптом, тогда за счет чего база могла вырости на 3 метра??

Трудно сказать. Скрипт только разбирает и собирает посты, вроде ничего лишнего не добавляется... Надо посмотреть...

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

Тоесть он имеет 18 пустых символов в начале и в конце. Того 36 символов с каждого поста * 130700 = 4705200 символов ПУСТЫХ всего.

Это поправить кстати легко. Смотри в скрипте функции remount_post() и remount_message. Там ровно перед return $txt; добавь строчку:

$txt=trim($txt);

Это просто удалит пробелы в начале и конце постов.

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

Расскажешь, как получилось. Кстати, может сделать хак для админки, чтоб можно было отдельный форум ребилдить? Знатоки PHP и IPB - присоединяйтесь!
Ссылка на комментарий
Поделиться на других сайтах

Total

Видишь ли в чем проблема - хоть опыт в программировании я имею (все-таки на сисадмина учусь), но с PHP дел имел мало, поэтому насчет оптимизированности кода могу очень ошибаться (в смысле что можно сделать проще - просто пока слабо представляю возможности PHP). Так что не отказался бы от помощи в создании хака для админки. Хотя не исключено, что сделаю все сам...

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

  • 2 месяца спустя...
Пробовал скрипт! Лопатит базу нормально но только до 7500 постов а дальше просто останавливается.... А у меня 26000 постов... Может кто подскажет чего еще можна сделать? Лимит времени снял...
Ссылка на комментарий
Поделиться на других сайтах

ross104

Ничего сказать не могу... Попробуй оптимизировать таблицы (Optimize в общем). Так же возможно что дело-то идет, но просто на экране не отображается. В этом случае нужно просто подождать...

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

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

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

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