d1pro Опубликовано 3 Августа 2003 Жалоба Поделиться Опубликовано 3 Августа 2003 Название: 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 Нажмите здесь, чтобы скачать файл Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 3 Августа 2003 Жалоба Поделиться Опубликовано 3 Августа 2003 То что мне нужно. А то у меня пол базы с левыми ссылками на смайлы. Только вот есть 1 трабл: Fatal error: Maximum execution time of 30 seconds exceeded in c:\apache\htdocs\new2\sources\Drivers\mySQL.php on line 189 У меня база 70 метров Придумайте чтонить Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 3 Августа 2003 Автор Жалоба Поделиться Опубликовано 3 Августа 2003 Total Все, немного обновил, оптимизировал (а то оно тысячи запросов делало, теперь порядок). Если времени не хватает - надо раскомментировать указанную строчку. Теоретически за конечное время выполнит Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 3 Августа 2003 Жалоба Поделиться Опубликовано 3 Августа 2003 хорошо - завтра попробую Спасибо Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 4 Августа 2003 Автор Жалоба Поделиться Опубликовано 4 Августа 2003 Жду комментариев по работе. Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 19 Августа 2003 Жалоба Поделиться Опубликовано 19 Августа 2003 Начало обработкиИницализация таблицы смайлов...Смайлы инициализированы. 90 запросов проведеноОбработка постовОбработано: 500 из 130408................................................... Прошло все успешно. ОГРОМНОЕ СПАСИБО. А можно сделать примерно тоже самое для ЦИТАТ. У меня раньше был другой вид цитаты, и на половине форума он так и остался, а то не красиво как-то Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 19 Августа 2003 Автор Жалоба Поделиться Опубликовано 19 Августа 2003 Total Так он все 130408 просмотрел?Может тогда сделать скрипт для пересборки сообщений полностью? Т.е. все сообщения будут разобраны на код и собраны вновь. Правда времени это займет больше (в смысле процесс обработки). Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 19 Августа 2003 Жалоба Поделиться Опубликовано 19 Августа 2003 d1pro а думаешь он будет пересматривать все коды ???? php / code / quote etc ... ?? Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 19 Августа 2003 Автор Жалоба Поделиться Опубликовано 19 Августа 2003 Total Ну можно по разному сделать. Можно сделать чтобы он пересобирал все тэги, зарегестировнные на форуме (т.е. даже те, что хаками добавлены),однако это будет слегка не оптимально и может временно положить сервер (по крайней мере я так полагаю). Можно сделать оптимизировано, но только специфические тэги. Что нужно? Хотя наверно сделаю оба варианта... Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 19 Августа 2003 Жалоба Поделиться Опубликовано 19 Августа 2003 d1pro буду очень благодарен. Мне бы сделать aka [q] ну и все наверно 6) Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 20 Августа 2003 Автор Жалоба Поделиться Опубликовано 20 Августа 2003 Total В общем все оказалось не так сложно, как казалось , да и сервер вроде падать не будет. Вот этот скрипт разбирает, а за тем снова собирает все посты в темах, основываясь на настройках форумов (разрешения на 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>"; ?> Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 20 Августа 2003 Жалоба Поделиться Опубликовано 20 Августа 2003 Ок - сегодня вечером на локалке прогоню его, если все будет нормально то и на форуме. Насчет хтмл. У меня стоит что толькоя могу его использовать. Не будет с этим траблов? Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 20 Августа 2003 Жалоба Поделиться Опубликовано 20 Августа 2003 Ого - багу нашел У меня база выросла на 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 метра?? Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 20 Августа 2003 Автор Жалоба Поделиться Опубликовано 20 Августа 2003 Total Насчет хтмл. У меня стоит что толькоя могу его использовать. Не будет с этим траблов?Даже не знаю. Вообще-то скрипт использует разрешения, установленные на каждый форум, т.е. если на форуме отключить использование чего-то, то после прогонки скрипта оно исчезнет. Надо подумать, как сделать для каждого пользователя. Думаю потребуется гораздо больше запросов.ЗЗЫ. А символы эти были вроде и до апгрейда этим скриптом, тогда за счет чего база могла вырости на 3 метра??Трудно сказать. Скрипт только разбирает и собирает посты, вроде ничего лишнего не добавляется... Надо посмотреть... Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 21 Августа 2003 Автор Жалоба Поделиться Опубликовано 21 Августа 2003 Тоесть он имеет 18 пустых символов в начале и в конце. Того 36 символов с каждого поста * 130700 = 4705200 символов ПУСТЫХ всего.Это поправить кстати легко. Смотри в скрипте функции remount_post() и remount_message. Там ровно перед return $txt; добавь строчку:$txt=trim($txt); Это просто удалит пробелы в начале и конце постов. Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 21 Августа 2003 Жалоба Поделиться Опубликовано 21 Августа 2003 d1pro спасибо - думаю вечером, если будет время, попробую Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 21 Августа 2003 Автор Жалоба Поделиться Опубликовано 21 Августа 2003 Расскажешь, как получилось. Кстати, может сделать хак для админки, чтоб можно было отдельный форум ребилдить? Знатоки PHP и IPB - присоединяйтесь! Ссылка на комментарий Поделиться на других сайтах Прочее
Total Опубликовано 21 Августа 2003 Жалоба Поделиться Опубликовано 21 Августа 2003 d1pro Было бы хорошо если по отдельности можно было и вместе. Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 23 Августа 2003 Автор Жалоба Поделиться Опубликовано 23 Августа 2003 Total Видишь ли в чем проблема - хоть опыт в программировании я имею (все-таки на сисадмина учусь), но с PHP дел имел мало, поэтому насчет оптимизированности кода могу очень ошибаться (в смысле что можно сделать проще - просто пока слабо представляю возможности PHP). Так что не отказался бы от помощи в создании хака для админки. Хотя не исключено, что сделаю все сам... Ссылка на комментарий Поделиться на других сайтах Прочее
ross104 Опубликовано 11 Ноября 2003 Жалоба Поделиться Опубликовано 11 Ноября 2003 Пробовал скрипт! Лопатит базу нормально но только до 7500 постов а дальше просто останавливается.... А у меня 26000 постов... Может кто подскажет чего еще можна сделать? Лимит времени снял... Ссылка на комментарий Поделиться на других сайтах Прочее
d1pro Опубликовано 15 Ноября 2003 Автор Жалоба Поделиться Опубликовано 15 Ноября 2003 ross104 Ничего сказать не могу... Попробуй оптимизировать таблицы (Optimize в общем). Так же возможно что дело-то идет, но просто на экране не отображается. В этом случае нужно просто подождать... Ссылка на комментарий Поделиться на других сайтах Прочее
Рекомендуемые сообщения