Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » Обнуление или исчезновение топиков

Модерирует : Antuan

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3

Открыть новую тему     Написать ответ в эту тему

Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lynx
Shurik
Спасибо.
 

Цитата:
посмотри, у тебя в checkboard.cgi че-нить с allforums.bak есть?

че-нить есть. Два  вхождения, как в дефолтной.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 01:24 11-06-2003
olsufr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Предлагаю следующее решение против обнуления файлов *.thd
Причина в этом обнулении, на мой взгляд, состоит в удалении CGI-процесса сервером во время записи сообщений темы в файл.
Дело в том, что при открытии файла в режиме ">" его содержимое сразу же разрушается,
а новая информация еще не записана. И вот если процесс будет убит на этом этапе, то содержимое темы будет потеряно.
Предлагаю следующий код, в котором файлы *.thd открываются в режиме "+<".
Этот режим позволяет читать и записывать в файл без его первоначального разрушения.
Для этого режима файл должен уже существовать, что и имеет место быть при добавлении сообщения в уже существующую тему и при редактировании ранее написанного сообщения.
 
 
В файле post.cgi в подпрограмме sub addreply находите строки:
(Данные коррекции даны для файла post.cgi без хака склеивания постов,
если новый пост не позднее 2-х часов)


Код:
        # Grab the thread file
         
        $filetoopen = "$ikondir" . "forum$inforum/$intopic.thd";
        $filetoopen = &stripMETA($filetoopen);
        open(FILE, "$filetoopen");
        @allmessages = <FILE>;
        close(FILE);

        и заменяете их на:

Код:
$filethd = "$ikondir" . "forum$inforum/$intopic.thd";
open(FILETHD, "+<$filethd");
flock(FILETHD, 2);
@allmessages = <FILETHD>;

 
Далее находите строки, в которых осуществляется запись в файл *.thd а именно:

Код:
        $filetomake = "$ikondir" . "forum$inforum/$intopic.thd";
        $filetomake = &stripMETA($filetomake);
        foreach $messages (@allmessages) {
            chomp $messages;
            $processed_data .= "$messages\n";
            }
        $processed_data .= "$inmembername|$topictitle|$postipaddress|$inshowemoticons|$inshowsignature|$currenttime|$inpost";
        open(FILE, ">$filetomake");
         flock(FILE, 2);
        print FILE $processed_data;
        close(FILE);
        undef $processed_data;

и заменяете их на:

Код:
$last_message = "$inmembername|$topictitle|$postipaddress|$inshowemoticons|$inshowsignature|$currenttime|$inpost\n";
seek(FILETHD, -1, 2);
unless ( sysread(FILETHD,$last_char,1) ) { $output = ''; &error("$ibtxt{'1428'}&Ошибка вовремя записи сообщения"); }
if ($last_char ne "\n") { $last_message = "\n".$last_message; }
print FILETHD $last_message;
close(FILETHD);

 
 
Похожие изменения надо сделать и в файле postings.cgi в подпрограмме sub processedit , которая осуществляет редактирование сообщения пользователя.
 
Находите строки:

Код:
            $filetoopen = "$ikondir" . "forum$inforum/$intopic.thd";
            open(FILE, "$filetoopen");
            @allthreads = <FILE>;
            close(FILE);
 

и заменяете их на:

Код:
$filethd = "$ikondir" . "forum$inforum/$intopic.thd";
open(FILETHD, "+<$filethd");
flock(FILETHD, 2);
@allthreads = <FILETHD>;

 
 
Далее находите такие строки:

Код:
            $filetoopen = "$ikondir" . "forum$inforum/$intopic.thd";
            open(FILE, ">$filetoopen");
              flock(FILE, 2);
            print FILE $processed_data;
            close(FILE);

и заменяете их на:

Код:
seek(FILETHD, 0, 0);
print FILETHD $processed_data;
truncate(FILETHD, tell(FILETHD));
close(FILETHD);

 
 
-----------------------------
Примечания:
Код:
1. В функции join между одинарными кавычками ппробела нет.
2. Функция seek(FILETHD, 0, 0) перемещает указатель текущей позиции файла на его самое начало.
3. Функция tell(FILETHD) сообщает о текущей позиции в файле, на который указывает указатель FILETHD
4. Функция truncate(FILETHD, tell(FILETHD)) обрезает файл, на который указывает указатель FILETHD, на месте текущей позиции указанной функцией tell

 

Всего записей: 363 | Зарегистр. 07-08-2002 | Отправлено: 17:29 18-11-2003
Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
olsufr
Надо будет попробовать, спасибо.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 21:57 18-11-2003
lynx



Advanced lynx
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У кого-нибудь это получилось прикрутить?
 
У меня вечно пишет ошибку записи.
 
Вот этот код:
 

Цитата:
 
$last_message = "$inmembername|$topictitle|$postipaddress|$inshowemoticons|$inshowsignature|$currenttime|$inpost\n";  
seek(FILETHD, -1, 2);  
unless ( sysread(FILETHD,$last_char,1) ) { $output = ''; &error("$ibtxt{'1428'}&Ошибка вовремя записи сообщения"); }
if ($last_char ne "\n") { $last_message = "\n".$last_message; }  
print FILETHD $last_message;  
close(FILETHD);  

 
 
Я правильно это читаю?
 
Пока (в переменную $last_char из файла топика *.thd не читается ни одного байта){
переменная $output пустая;
пишем ошибку;
}
 
 
В общем, что-то тут не так...

Всего записей: 11712 | Зарегистр. 08-05-2001 | Отправлено: 19:34 03-12-2003
olsufr



Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
lynx, читается этот код так:
1. Считывается последний символ (байт) из файла (в переменную $last_char из файла топика *.thd).
 
2. Если это считывание неудачно, т.е. если, например, файл поврежден или нет соответствующих прав, то выводится сообщение об ошибке. А т.к. к этому времени в переменной $output уже лежит сгенерированный код хорошей страницы, то сначала эта переменная опустошается, а потом дело передается в руки подпрограммы error, которая генерирует страницу с сообщением об ошибке.
 
3. Далее проверяется содержимое переменной $last_char и если оно не символ новой строки, в начало переменной $last_message добавляется символ новой строки (чтобы новое сообщение не слиплось с предыдущим, т.к. старый скрипт чего-то не считал нужным ставить завершающий символ новой строки в конце каждого последнего сообщения).
 
4. Ну а потом, идет запись переменной $last_message.
 
----------------------------
 
Странно, но у меня все работает хорошо:
и на локалке с Windows и на сервере на Linux.
 
Может быть дело в различиях разных видов окончания строки?
По определению функция sysread() возвращает число символов, которые удалось считать, или 0 - в конце файла, или undef - если произошла ошибка чтения.
Так вот, может в твоем случае возвращается 0?
 
Попробуй в работе (на локалке естественно и с темой, которую не жалко) такой фрагмент кода:
вместо seek(FILETHD, -1, 2); написать seek(FILETHD, -2, 2);

Код:
$last_message = "$inmembername|$topictitle|$postipaddress|$inshowemoticons|$inshowsignature|$currenttime|$inpost\n";
seek(FILETHD, -1, 2);
unless ( sysread(FILETHD,$last_char,1) ) { $output = ''; &error("$ibtxt{'1428'}&Ошибка вовремя записи сообщения"); }
if ($last_char ne "\n") { $last_message = "\n".$last_message; }
print FILETHD $last_message;
close(FILETHD);

 
Когда я на локалке (Windows) экспериментировал, то этот код хорошо работал
и с seek(FILETHD, -1, 2); и с seek(FILETHD, -2, 2);
В чем причина - сам толком не понимаю. Может кто объяснит?
 
А вот мои результаты:
после внесения в код данных изменений в течение недели на форуме не появилось ни одного обнуленного файла! Конечно, неделя срок небольшой - будем ждать дальше.
 

Всего записей: 363 | Зарегистр. 07-08-2002 | Отправлено: 10:25 04-12-2003 | Исправлено: olsufr, 12:00 04-12-2003
katja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
У меня обнулились файлы .pl
 
Я изучила топик от начала до конца и немного запуталась...
Думаю, что мне помогут коды, написанные Shurik 14:11 08-06-2003  
 
Объясните чайнику, в каком файле что на что меняется!!!

Всего записей: 37 | Зарегистр. 01-11-2003 | Отправлено: 13:36 15-02-2005
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
katja Вот этот?:  

Цитата:
Цитата:куда помещать sub recount?    
 
 
Помести в икон.либ, а вызывай &recount каждый раз при запросе list.cgi  
 
 
Цитата:$filetoopen = "$ikondir" . "forum$inforum/list.cgi";  
    if (-z $filetoopen) {  
       &recount;  
    }    

 

Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 20:08 15-02-2005
katja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
куда засунуть вызов, я нашла...
а вот куда саму процедуру Recount?
файла list.cgi у меня нет. я так понимаю, надо создать его с этой процедурой?

Всего записей: 37 | Зарегистр. 01-11-2003 | Отправлено: 22:37 15-02-2005 | Исправлено: katja, 22:42 15-02-2005
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
katja В любое место в  ikon.lib,  можно  перед

Код:
1;


Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 22:42 15-02-2005
katja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
сделала.
но не работает пересчет сообщений в админцентре...
 
в какой момент должны "пересоздаваться" *.pl?

Всего записей: 37 | Зарегистр. 01-11-2003 | Отправлено: 22:50 15-02-2005
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
katja

Цитата:
в какой момент должны "пересоздаваться" *.pl?  
При добавлении сообщения в тему...
Еще при редактировании названия топика... Можно попробывать в названиях темы, где обнулились .pl , изменить наименование топика, например добавить точку к названию и посмотреть результат: востановится  или нет.  
Если, правда, топик  открывается...

Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 02:44 16-02-2005
Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
katja
Не восстановит рекаунт pl-ки. Для восстановления pl где-то здесь был скрипт, протестченный и рабочий. Не могу найти, автор скрипта, по-моему, RQ. Топик был очень старый.
Юзать лучше на локалке, если будет надо, я расскажу, какие у него грабли.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 16:42 17-02-2005
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Marilda А я попробывал с редактированием топика и получилось.
Обнулил .pl и открыл топик на редактирование - инфа появилась в .pl. Единственное, что инфа  есть, а размер  все равно нулевой.

Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 17:38 17-02-2005
katja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
trew
Я воспользовалась Вашим советом, и теперь при редактировании названия я имею НЕнулевой по размеру топик с таким содержанием:
 
137|название топика||||10||||
 
при появлении сообщения, топик заметно преобразуется:
137|название топика||open|8|10|||Lucia|1108057261
 
По-моему, у меня получилось, НО
В прошлом году у меня рухнула статистика.
Раз в три дня я делаю пересчет сообщений в админцентре, так как в активных разделах
число тем не соответствует действительности.
Сейчас эта функция недоступна. Как поступать в таком случае?
 
 
Marilda
Я тоже не нашла скрипт, о котором Вы пишете.
Если он старый, то его могли кинуть в архив, а это все равно, что искать иголку в стоге сена.

Всего записей: 37 | Зарегистр. 01-11-2003 | Отправлено: 12:45 21-02-2005
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
katja

Цитата:
Сейчас эта функция недоступна.
она не доступна из админцентра или просто не правильно  работает? То есть, если можно. то по-подробнее, пожалуйста....
Почему я спрашиваю, потому что у меня  эта функция работает, но не правильно: вид работы есть, а подсчет не происходит...

Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 15:13 21-02-2005
katja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Когда раньше из админцентра я запускала пересчет сообщений в конкретном разделе, то получала отчет, что в этом разделе столько-то тем, столько-то сообщений. Как правило, после такого пересчета на 50-100 тем было меньше.
Сейчас, нажав на пересчет, получаю пустое правое окно.

Цитата:
эта функция работает, но не правильно: вид работы есть, а подсчет не происходит...
Как понять, "подсчет не происходит"?

Всего записей: 37 | Зарегистр. 01-11-2003 | Отправлено: 17:51 21-02-2005
trew

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
katja

Цитата:
Как понять, "подсчет не происходит"?
В форуме напрмер по счетчику 20 тем и 100 постов. но реально меньше. Когда нажимае пересчет, то процедура проходит нормально, и выводится отчет о тех же 20 тем и 100 постов...
 

Цитата:
Сейчас, нажав на пересчет, получаю пустое правое окно.  
Где-то пропущена(лишняя)  скобка или точка с запятой...
Это находится в setforums.cgi.
Хорошо бы сравнить  функцию пересчета с дефолтной на предмет ошибки:
sub recount {  и ниже всю функцию
А так же  
Код:
'recount'             =>    \&recount  
есть ли такая строчка и нету ли запятой возле нее...
Или по логам, если они есть...  

Всего записей: 716 | Зарегистр. 15-11-2003 | Отправлено: 18:58 21-02-2005 | Исправлено: trew, 19:01 21-02-2005
katja

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
еще раз трезвым взглядом посмотрела:
при нажатии на "Пересчитать номера сообщений" переходит по адресу типа такого:
.../cgi-bin/ikonboard/setforums.cgi?action=recount&forum=12
 
... и все.... правая часть окна оказывается пустой. судя по времени, никакой пересчет на самом деле и не ведется...
 
не может это быть связано с тем, что и эта и свежевставленная функции называются recount-ом?
 
синтаксис проверила два раза: все правильно...  
 
нехорошо без пересчета как-то жить...
и обнуленные *.pl не восстанавливаются, да и просто пересчетом иногда приходится пользоваться...

Всего записей: 37 | Зарегистр. 01-11-2003 | Отправлено: 22:09 09-03-2005
Marilda

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Нашла у себя, кажется, тот самый скрипт (c) RQ. Помещаю, пока снова не потеряла.
Перед использованием, умоляю, потестите!
 

Код:
#!/usr/bin/perl  
use Fcntl ':flock';  
use CGI qw(:standard);  
require "ikon.lib";  
require "data/progs.cgi";  
require "data/boardinfo.cgi";  
print header();  
#21 поменяй на номер форума  
rebuildLIST2(21);  
sub rebuildLIST2 {  
    my ($forum) = @_;  
    opendir (DIR, "$ikondir" . "forum$forum");  
    my @entry = grep(/pl/, readdir(DIR));  
    closedir (DIR);  
    open (TMP, "$ikondir" . "forum$forum/list.cgi");  
    flock(TMP,LOCK_SH);  
    my @listf = <TMP>;  
    foreach (@listf){  
            chomp $_;  
            my ($topicids) = split (/\|/,$_);              
            $liststruct{$topicids} = [split (/\|/,$_)];  
            }  
    flock(TMP,LOCK_UN);  
    close (TMP);  
    undef @listf;  
    my @dat;  
    foreach my $lol (@entry){            
            my $rr;  
            my ($id) = split(/\./, $lol);  
                open (TMP, "$ikondir" . "forum$forum/$id.pl");  
                flock(TMP,LOCK_SH);  
                         
                my ($topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter, $lastpostdate) = split (/\|/,<TMP>);  
                flock(TMP,LOCK_UN);  
                close (TMP);  
                 
                open (TMP, "$ikondir" . "forum$forum/$id.thd");  
                flock(TMP,LOCK_SH);  
                my @thds = <TMP>;  
                my ($startedby, $topictitle, undef, undef, undef, $startedpostdate) = split(/\|/,$thds[0]);  
                flock(TMP,LOCK_UN);  
                close (TMP);  
                next if (length(join('', @thds)) < 5 || $topictitle eq "");  
                $topicid = $topicid ne "" ? $topicid : $id;                  
                $threadstate = $threadstate ne "" ? $threadstate : "open";    
                $threadposts = $threadposts ne "" ? $threadposts : $#thds;    
                $threadviews = $threadviews ne "" ? $threadviews : $#thds;                    
                my ($lastposter, undef, undef, undef, undef, $lastpostdate) = split(/\|/,$thds[$#thds]);                  
                 
                $topicdescription =~ s/(:::(.*?)\b//;  
                open (FILE, ">$ikondir" . "forum$forum/$id.pl");  
                flock(FILE,LOCK_EX);              
                print FILE "$topicid|$topictitle|$topicdescription|$threadstate|$threadposts|$threadviews|$startedby|$startedpostdate|$lastposter|$lastpostdate";  
                flock(FILE,LOCK_UN);  
                close (FILE);  
                push (@dat, "$lastpostdate|$topicid|$topictitle|$topicdescription|$threadstate|$threadposts|$threadviews|$startedby|$startedpostdate|$lastposter");  
                 
        }  
 
        my @sortdat = reverse(sort(@dat));  
        open (LIST, ">$ikondir" . "forum$forum/list.cgi");  
        flock(FILE,LOCK_EX);  
        foreach (@sortdat) {  
            chomp $_;  
            next if(! $_);  
            my ($lastpostdate, $topicid, $topictitle, $topicdescription, $threadstate, $threadposts, $threadviews, $startedby, $startedpostdate, $lastposter) = split (/\|/,$_);  
            print LIST "$topicid|$topictitle|$topicdescription|$threadstate|$threadposts|$threadviews|$startedby|$startedpostdate|$lastposter|$lastpostdate\n" if ($topictitle);  
            }  
        flock(FILE,LOCK_UN);  
        close (LIST);  
 
 
 
}  
 

 
Добавлено:
Несколько слов о его эксплуатации.
Очень полезен для восстановления большого числа убитых pl-ок, если на сервере есть их thd. Воспроизводит все кроме подтемы, это и естественно - в thd нет $topicdescription. Минус один: обновляет ВСЕ pl-ки, даже не убитые, поэтому все топики оказываются названными без подтем. Поэтому лучше юзать на локалке, в отдельный форум побросать thd-шки, у которых обнулены pl, и вызвать скрипт.
 
Вместо смайлика - двоеточие со скобкой, ну вы поняли.

Всего записей: 381 | Зарегистр. 24-10-2002 | Отправлено: 14:02 24-03-2005 | Исправлено: Marilda, 14:17 24-03-2005
Prosto_Alex1

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
нашелся на ikonboard.com вот такой скрипт:
http://forums.ikonboard.com/support/ikonboard.cgi?act=ST;f=74;t=12722;hl=pl+byte+script
 
#!/usr/bin/perl
 
use CGI::Carp "fatalsToBrowser";          # Output errors to browser
use CGI qw(:standard);                    # Saves loads of work
$|++;                                     # Unbuffer the output
print header();
 
# Open and inspect each file *.thd in turn,
# take only files in the current directory.
for (glob "*.thd") {
  print "$_\n";
  next if ! m/(\d+).thd/;
  my $topic_no = $1;
  my $index_file = $topic_no . '.pl';
  print "   matches $index_file<br>";
  my ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,
      $atime,$mtime,$ctime,$blksize,$blocks) = stat ($index_file);
  print "   $index_file: $size bytes<p>";
  rebuild_index ($topic_no, $_, $index_file) if $size == 0;
}
 
print "#### DONE! ####";
 
 
sub rebuild_index
{
  my ($topic_no, $topic_file_name, $index_file_name) = @_;
  die "No file names!" if !$topic_file_name or !index_file_name;
  print "   Rebuilding $index_file_name<br>";
 
#  Read the topic file in one go; assume it's small enough not#
#  to cause a memory famine.  Put each line of the file in its
#  own array element.  From this, extract the first and last lines
#  and count the number of lines.  It is a fatal error for the
#  file to have no lines.
  open (TOPIC, $topic_file_name) or die "Can't open $topic_file_name: $!";
  my @lines = <TOPIC>;
  my $n_lines = scalar @lines;
  die "No lines in $topic_file_name" if $n_lines < 1;
  my $first_line = @lines[0];
  my $last_line  = @lines[$#lines];
  close TOPIC;
 
#  Parse the first line. The fields are delimited by '|' symbols and
#  there are no newline characters embedded.
  my ($first_poster, $title, $junk, $junk, $junk, $first_time, @junk) = split /\|/, $first_line;
 
#  Parse the last line. Same rules as for the first line.
  my ($last_poster, $junk, $junk, $junk, $junk, $last_time, @junk) = split /\|/, $last_line;
  print "   No. of lines: $n_lines<br>  Title: $title<br> Topic Starter: $first_poster<br> Last Poster: $last_poster<br> Created: $first_time<br> Last Post: $last_time<br>";
 
#  Format the line to go in the index file.
  my $sub_title = '';
  my $n_views   = 0;
  my $index = "$topic_no|$title|$sub_title|open|$n_lines|$n_views|$first_poster|$first_time|$last_poster|$last_time";
  print "   $index\n";
 
#  Finally, restore the index file.
  open (INDEX, ">$index_file_name") or die "Can't open $index_file_name: $!";
  print INDEX $index;
  close INDEX;
}
 
1;
 
с его помощью восстановились все .pl (кроме естественно убитых .thd)  
так что временно вопрос снят...
кстати, буржуи на ikonboard.com пишут что не знаю-таки причину этого неприятного явления....
вроде как на 2.2 пытались вылечить, но по отзывам получилось не очень...
 
неужели переходить на 3.1????

Всего записей: 7 | Зарегистр. 23-06-2004 | Отправлено: 09:34 18-04-2005
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3

Компьютерный форум Ru.Board » IkonBoard и другие форумы » Ikonboard v.2 » Обнуление или исчезновение топиков


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru