X



トップページ運用情報
1001コメント347KB

bbs.cgi再開発プロジェクト 3

■ このスレッドは過去ログ倉庫に格納されています
00012chtubo愛用者〜ヘ(゚д゚ヘ))))))〜61 ◆yBEncckFOU
垢版 |
04/02/13 19:08ID:o3jHs/Mb
peko鯖の稼動によりボトルネックの一つである事がより明らかになった
bbs.cgi作り直しプロジェクトです。

関連スレ
【Project peko】2ch特化型サーバ構築作戦 Part6
http://qb3.2ch.net/test/read.cgi/operate/1076413123/
◆ 全サーバトリップ統一作戦
http://qb3.2ch.net/test/read.cgi/operate/1067245837/
bby -- スレッド情報一元管理システム構築スレ
http://qb3.2ch.net/test/read.cgi/operate/1073058944/
BBQ システム(公開串リストメンテ)
http://qb3.2ch.net/test/read.cgi/operate/1073061576/
【連投規制】Samba24 情報要望スレ その3
http://qb3.2ch.net/test/read.cgi/operate/1075568934/
【広告】Rock54【自動排除】 3
http://qb3.2ch.net/test/read.cgi/operate/1074735308/
■ 新しいサーバで read.cgi が正しく動かない問題。 (dat落ち)
http://qb.2ch.net/test/read.cgi/operate/1047840578/


前スレ
bbs.cgi 再開発プロジェクト
http://qb3.2ch.net/test/read.cgi/operate/1053067870/
bbs.cgi再開発プロジェクト2
http://qb3.2ch.net/test/read.cgi/operate/1069144193/
0278▲ 某ソレ511
垢版 |
04/02/29 03:30ID:3Ckm5k37
>>272
あ、それ思った。

if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}

あと、各所で1001が消えてるみたいだけど、気にしない方向で。
0279仕事人 ★
垢版 |
04/02/29 03:35ID:???
変更

if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
0280▲ 某ソレ511
垢版 |
04/02/29 03:41ID:3Ckm5k37
>>277
それって
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
でよいような気がする。。あとで$datsizeisを別に使うならまだしも。
で、ファイルのパーミッションを取得するのは
 (stat("$DATAFILE"))[2]
だそうです。
0282▲ 某ソレ511
垢版 |
04/02/29 03:45ID:3Ckm5k37
>>281
あっ、そっちのほうがスマートだね、、じゃあ、
unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
こうだとよいのかな?(下はどうでもいいけど、、)
0283仕事人 ★
垢版 |
04/02/29 03:47ID:???
入れてこますか

unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}

でも 二回実行するより stat とったほうがいいのかな?
0284仕事人 ★
垢版 |
04/02/29 03:49ID:???
× 入れてこますか
○ 入れてみますか

0286動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 03:58ID:fntZHoXb
unless (-w $DATAFILE) {
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless (-s _ <= 512000) {
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
でどうでしょ。
0287動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 03:58ID:VMV/4FdL
書き込み可能かの判定はaccess()でも出来るけど
サイズの判定はstat()じゃないと駄目なので、結局stat()は呼ばれる。

と思うのでstat()1回に一票。
0289仕事人 ★
垢版 |
04/02/29 04:02ID:???
つまり

if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}

これは保険で

unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}

が通常のルートですなぁ
メッセージ変えておこうかな、
0291▲ 某ソレ511
垢版 |
04/02/29 04:03ID:3Ckm5k37
>>286
だと2回目の判定で前回のデータから読み込むんだね、、
statじゃなくてもそれが一番よさげ。
0292仕事人 ★
垢版 |
04/02/29 04:04ID:???
>>290-291
( ・∀・)つ〃∩ヘェーヘェーヘェー


if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
0293動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 04:09ID:7x47pFWz
『1001』が書き込まれてないスレって、パーミションが
落ちてないような気がするけど大丈夫かな?

圧縮の時にパーミション見てたりしていない?
0294▲ 某ソレ511
垢版 |
04/02/29 04:16ID:3Ckm5k37
>>293
ニュー速の1001がいないスレにテスト書き込みしてみたけど、
「ERROR:このスレッドには書き込めません。」でした。
パーミションはちゃんと落ちてる模様。
0297動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 04:46ID:fntZHoXb
なにやら1001ストッパーがかかっているスレッドはsubject.txtに記録されているレス数が微妙に少ないような。
print OUT "1001<><>Over 1000 Thread<>このスレッド〜
のところに $lognum++ が必要な気がする……。
0298▲ 某ソレ511
垢版 |
04/02/29 04:46ID:3Ckm5k37
>>295
分かりづらくてすまん。>>296の言うとおり、
>>292のメッセージが入っているという前提でした。。
0299▲ 某ソレ511
垢版 |
04/02/29 04:48ID:3Ckm5k37
>>297
狼をしばらく見てたけど、どうやら
subject.txtに1001と書いてある→1001ストッパーがいない
subject.txtに1002と書いてある→1001ストッパーがいて、普通通り止まっている
になってるみたいです。
0302動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 09:49ID:5EYN+Lkh
試しに狼の1000超えスレッド15本を見ると、
 subject.txtは1002、datは1001、1001ストッパーあり:8スレッド
 subject.txtは1001、datは1001、1001ストッパーあり:3スレッド
 subject.txtは1001、datは1000、1001ストッパーなし:4スレッド
でした。subject.txtの勝率2割。

Live2chだと実害はありませんが、
「新着あり」→「レス取得」→「新着あり」の永久コンボです。
そろそろ雑質スレや専用ブラウザスレが騒がしくなってきました。
0305root ★
垢版 |
04/02/29 11:18ID:???
live9も、もじもじ。
0306root ★
垢版 |
04/02/29 11:30ID:???
ここのやりとりを起き抜けでぼおっと読みました。

作戦の趣旨は理解できたです。
あとは、超高負荷になった時にどうなるかということで。
0307GlobalService ★
垢版 |
04/02/29 11:42ID:???
>306
live8に入れないと分からない

1.( 1001 < $lognum) && ($lognum < 2000)の範囲内
2.datファイルが壊れる
3.鯖が落ちる
のどれか
0308root ★
垢版 |
04/02/29 11:47ID:???
もう仕事人さんがlive8に入れてありました。(Perl版)
さきほど私がperlccにかけて、バイナリ版にしました。

入れてあるから、1000までしかいかないんではないかと。

■2/29■ハロー!モーニング。スペシャル■Part3■
http://live8.2ch.net/test/read.cgi/dancesite/1078018021/
0310動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 13:56ID:aErj63/K
そもそも高速処理が要求されるのに
高コストなライトパーミッションクローズでとめられるのかというと・・・

キャッシュがされないDNSのようなしくみがあればいいんですが。
0311動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 14:08ID:aErj63/K
>>310
訂正。

>>191の案1で1000を越えていたときのみキャッシュするようにする。

たとえばこのスレを例にとり、
1076666901.oparete..qb3.tts.2ch.netなるホストの逆引きで
1000を越えているいないでキャッシュの許可権限を動的に変換できないかということ。
0313仕事人 ★
垢版 |
04/02/29 14:22ID:???
>>279 のどこが悪いんだ?

ここじゃなくて他のところが悪いの?
0314サザン ★
垢版 |
04/02/29 14:28ID:???
状況が飲み込めてないおいら。
過去ログ読もう。
0315root ★
垢版 |
04/02/29 14:29ID:???
>>313
>>279 だと、
確実に書き込みは止まると思うけど、
高負荷だと「このスレッドは1000を超えました」を誰も通らないことになると思う。
…つか、実際になってるか。
0316サザン ★
垢版 |
04/02/29 14:31ID:???
>>313
>>279
多分、

if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}

の部分を誰も通ってないのではないかと。。
0318root ★
垢版 |
04/02/29 14:33ID:???
今、live8/livecxのチェックを番組を未ながらやってるです。
この内容じゃ、速いの当たり前か。
0319root ★
垢版 |
04/02/29 14:33ID:???
未ながら => 見ながら
0323サザン ★
垢版 |
04/02/29 14:36ID:???
やっぱり根本的に作り直さないとダメなのかなぁ、、
0324仕事人 ★
垢版 |
04/02/29 14:36ID:???
>>320
はいってます。

もう一回掲示するネ
0325仕事人 ★
垢版 |
04/02/29 14:37ID:???
(1) bbs.cgi の序盤

unless( -w $DATAFILE){
DispError("ERROR!","ERROR:このスレッドには書き込めません。");
}
unless( -s $DATAFILE <= 512000){
DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
}
0326仕事人 ★
垢版 |
04/02/29 14:38ID:???
(2) bbs.cgi の中盤の最後 (datへの追記)

if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}


0327仕事人 ★
垢版 |
04/02/29 14:39ID:???
(3) bbs.cgi の終盤の始め

#==================================================
# ファイル操作(subject.txt & subback.html)
#==================================================

{
#サブジェクトパスを作成

my $rnd = int(rand(99999));

my $subject = $PATH . "subject.txt";
my $subtemp = $PATH . $rnd . $FORM{'time'} . ".tmp";
my $keyfile = $FORM{'key'} . ".dat";
use vars qw($FILENUM);
use vars qw($SUBLINE);
use vars qw(@newsub);

#サブジェクトファイルを読み込む
unless(-e "$subject"){
makesub();
}
open(SUBR,"<$subject");#SUBJECTを開く
my @SUBJECTLIST = <SUBR>;#内容を全て読み込む
close(SUBR);#閉じる
$FILENUM = @SUBJECTLIST;

MakeWorkFile($FORM{'key'});

if($FORM{'subject'} ne ""){
#subjectがあれば新規スレッド
my $subtm = "$keyfile<>$FORM{'subject'} (1)\n";
@newsub = ($subtm, @SUBJECTLIST);
++$FILENUM;
}else{
my (@tempsub, $transub, $frontsub, $rearsub);
if($FORM{'mail'} =~ /sage/){
$transub = join('<<>>', @SUBJECTLIST);#一本につなげる
($frontsub, $rearsub) = split(/$keyfile<>/, $transub);#keyでぶったぎる
@tempsub = split(/<<>>/, $rearsub);#後半ぶつ切り
$transub = shift(@tempsub);#タイトルを取り出す
$transub = $keyfile . "<>" . $SUBLINE;#タイトル入れ替え
@newsub = (split(/<<>>/, $frontsub), $transub, @tempsub);
}else{
$transub = $keyfile . "<>" . $SUBLINE;
@newsub = ($transub, grep(!/^$FORM{'key'}/, @SUBJECTLIST));
}
}

if(@newsub){
#SUBJECTに書き込む
open(SUBT, ">$subtemp");
#flock(SUBT, 2);
foreach(@newsub){
print SUBT $_;
}
#flock(SUBT,8);
close(SUBT);
my $resuc = 0;
until($resuc){ $resuc = rename($subtemp, $subject); }
}else{
@newsub = @SUBJECTLIST;
}
}

0328仕事人 ★
垢版 |
04/02/29 14:40ID:???
関連するサブルーチンに

makesub();
MakeWorkFile($FORM{'key'});

この二つがある

0329仕事人 ★
垢版 |
04/02/29 14:41ID:???
#==================================================
# subject.txtの補完
#==================================================

sub makesub{
my $bbs = $FORM{'bbs'};
my $path = "../"."$bbs"; #$where{$bbs};
my $datpath = $path."/dat";

open(DIR, "ls $datpath/|") || print HTM " cant' ls.";
my @dir = <DIR>;
close(DIR);

my %time;
my @pagefile;

foreach(@dir){
chop();
my $mtime;
my $pagemax;
my $mt = "$mtime"."$_";
($mtime) = (stat("$datpath/$_"))[10];
$time{"$mt"} = $_;
++$pagemax;
}

my @mtime = keys(%time);
my @sorting = sort by_number @mtime;
my $filenum;
foreach(@sorting){
push(@pagefile,$time{"$_"});
#print $time{"$_"};
++$filenum;
}

#@pagefile = reverse(@pagefile);
my $num;
my $subject;

while($filenum>=$num){
my $showpage = @pagefile[$num];
if($showpage eq ""){
}
open(IN, "$datpath/$showpage")||die "";
my $resnum = 1;
my $rr = 0;
while(<IN>){
$resnum++;
if($rr == 0){
$_ =~ s/\n//gi;
$_ =~ s/\r//gi;

my ($name,$mail,$time,$message,$subject);
($name,$mail,$time,$message,$subject) = split(/,/,$_);
$rr = 1;
}
}
close(IN);
open(OUT,">$path/subject.txt");
print OUT $showpage .",";
print OUT "$subject($resnum)\n";
++$num;
close(OUT);
}
}

0330仕事人 ★
垢版 |
04/02/29 14:41ID:???
#==================================================
# ファイル操作(HTML作成用作業ファイル更新)
#==================================================

#HTML用DATを作成
#MakeWorkFile(KEY-NUMBER)
sub MakeWorkFile{
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);

open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);

#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
$lognum++;

if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
}

#1つ目の要素を読み込む
$firstlog = $logdat[0];
#改行カット
chomp($firstlog);

#1つ目の要素を加工する
($name,$mail,$time,$message,$subject) = split(/<>/,$firstlog);

$SUBLINE = $subject . " (" . $lognum . ")\n";

open(SHTM,">$workfile");#ログテンポラリを開く
#flock(SHTM,2);

#サブジェクトテーブルを吐き出す(ここは必ず1行にまとめること(処理効率))
#-----------------------------------------------------------------------
print SHTM <<EOF;
<TABLE border=1 cellspacing=7 cellpadding=3 width=95% bgcolor="$SETTING{"BBS_THREAD_COLOR"}" align=center><TR><TD><DL><a name="\$ANCOR"></a><DIV ALIGN="right"><a href ="#menu">■</a><a href="#\$FRONT">▲</a><a href="#\$NEXT">▼</a></DIV><B>【\$ANCOR:$lognum】<FONT size=5 color="$SETTING{'BBS_SUBJECT_COLOR'}">$subject</FONT></B>
EOF
#-----------------------------------------------------------------------


#1つ目のメールへのリンクを作成
if($ENV{'SERVER_NAME'} =~ /bbspink\.com/i)
{#if(bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/pinktower\.com\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;

}
} else {#if(!bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/ime\.st\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;

}
}###

if($mail ne ""){
$mailto = "<a href=\"mailto:$mail \"><b>$name </b></a>";
}else{
$mailto = "<font color=$SETTING{'BBS_NAME_COLOR'}><b>$name </b></font>";
}

#1つ目の要素を吐き出す
print SHTM "<dt>1 名前:$mailto $time<dd>$message <br><br><br>";

#ログ数から、表示コンテンツをチェック
if($lognum > $SETTING{"BBS_CONTENTS_NUMBER"}){
#ケツの要素を0〜9番までコンテンツに格納
@content[0..$SETTING{"BBS_CONTENTS_NUMBER"}-1] = @logdat[@logdat-$SETTING{"BBS_CONTENTS_NUMBER"}..@logdat-1];
$topnum=@logdat-($SETTING{"BBS_CONTENTS_NUMBER"}-1);
}else{
#アタマの要素を1〜10番までコンテンツに格納
@content[0..($SETTING{"BBS_CONTENTS_NUMBER"}-1)] = @logdat[1..$SETTING{"BBS_CONTENTS_NUMBER"}];
$topnum=2;
}

foreach(@content){
chomp($_);#改行をカット

#要素を加工する
($name,$mail,$time,$message,$subject) = split(/<>/,$_);

unless($_){
$topnum++;
next;
}

#要素のメールへのリンクを作成
if($ENV{'SERVER_NAME'} =~ /bbspink\.com/i)
{#if(bbspink)
#if(bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/pinktower\.com\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}
}else {#if(!bbspink)
unless($message =~ /2ch\.net/ || $message =~ /bbspink\.com/){
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/ime\.st\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}else{
$message =~ s/(https?|ftp|gopher|telnet|whois|news)\:\/\/([\w|\:\!\#\$\%\=\&\-\^\`\\\|\@\~\[\{\]\}\;\+\*\,\.\?\/]+)/<a href=\"http\:\/\/$2\" target=\"_blank\">$1\:\/\/$2<\/a>/ig;
}
}
##
if($mail ne ""){
$mailto = "<a href=\"mailto:$mail \"><b>$name </b></a>";
}else{
$mailto = "<font color=$SETTING{'BBS_NAME_COLOR'}><b>$name </b></font>";
}

print SHTM "<dt>$topnum 名前:$mailto :$time<dd>";

my @messx = split(/<br>/,$message);#メッセージを行でカット
my $messy = @messx;#行数を計算
if($messy > $SETTING{"BBS_LINE_NUMBER"}){
my $messz = join('<br>',@messx[0 .. $SETTING{'BBS_LINE_NUMBER'}-1]);
print SHTM "$messz <br>";
print SHTM "<font color=\"$SETTING{'BBS_NAME_COLOR'}\">(省略されました・・全てを読むには<a href=\"../test/read.cgi/$FORM{'bbs'}/$key/$topnum\" target=\"_blank\">ここ</a>を押してください)</font><br>";
}else{
my $messz = join('<br>',@messx[0 .. $messy-1]);
print SHTM "$messz <br>";
}

$topnum++;
print SHTM "<br>\n";
}

#-----------------------------------------------------------------------

#flock(SHTM,8);
close(SHTM);

#パーミッション調整
umask(0);
chmod(0666,$workfile);
}

0331未承諾広告※ ◆aiY4htt2.2
垢版 |
04/02/29 14:43ID:47xPabMI
>>325
-w $DATAFILE or ( -s $DATAFILE <= 512 * 1024) or DispError("ERROR!","ERROR:このスレッドには書き込めません。");
エラーの単純化っでどうかしら?理由はどうあれ書き込めないのですから(^-^)
0333サザン ★
垢版 |
04/02/29 14:47ID:???
そういえば、gethostbyaddr を二回やってるのはどうなんだろう。。。
0334未承諾広告※ ◆aiY4htt2.2
垢版 |
04/02/29 14:54ID:47xPabMI
>>331
追記および訂正。
our $Log_line = 1; # グローバル扱いで。以後レス数はこれを参照するとか。
if (open(OUT, "+>>$DATAFILE")) { $Log_line = join '', <OUT> =~ tr/\n/\n/ }
-w $DATAFILE or ( -s $DATAFILE <= 512 * 1024) or ($Log_line > 1000) or
 DispError("ERROR!","ERROR:このスレッドには書き込めません。");
0335++$lognum;の位置が悪い?
垢版 |
04/02/29 14:55ID:miDcWYdc
if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum > 1000)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
++$lognum;
if($lognum > 1000)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
}
}
0336仕事人 ★
垢版 |
04/02/29 14:58ID:???
>>335
そうなのか? そうなのか?
0337未承諾広告※ ◆aiY4htt2.2
垢版 |
04/02/29 15:01ID:47xPabMI
>>334
条件が無茶苦茶ですね。ごめんなさい。
(-w $DATAFILE and ( -s $DATAFILE <= 512 * 1024) and ($Log_line < 1001)) or
 DispError("ERROR!","ERROR:このスレッドには書き込めません。");
0338▲ 某ソレ511
垢版 |
04/02/29 15:03ID:3Ckm5k37
>>335
むしろそうするくらいなら、
++$lognum; を削除
だけで済むような。
0341▲ 某ソレ511
垢版 |
04/02/29 15:06ID:3Ckm5k37
>>339
うん。今そのことについて議論してるところかと。
0344仕事人 ★
垢版 |
04/02/29 15:10ID:???
if($lognum > 1010)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}

にしてみた。
0345仕事人 ★
垢版 |
04/02/29 15:11ID:???
>>340
どうなんですかねぇ
0346サザン ★
垢版 |
04/02/29 15:13ID:???
というか、datの書き込みのあとには、

#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);

がきてますよー。
0347動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 15:13ID:miDcWYdc
if($lognum > 1000)
{
++$lognum; #←これもいるかも
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
0349root ★
垢版 |
04/02/29 15:14ID:???
ただ、>>344 みたいなアプローチがどのぐらい効果あるかだけど、、、。
それで、1001ストッパーが書かれるような気は、あんまりしないかも。

ちょっとお出かけ。
0350仕事人 ★
垢版 |
04/02/29 15:15ID:???
#MakeWorkFile(KEY-NUMBER)
sub MakeWorkFile{
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);

open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);

#ログのカキコ数を取得
$lognum = @logdat;
if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
#$lognum++;   ← コメントにした
0351動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 15:15ID:YkP68lMj
>>330
#ログのカキコ数を取得
から
#1つ目の要素を読み込む
の前までがいらない。
この中の$lognum++;が最終的にsebject.txtに書かれているので
実際より+1された数が入ってしまう。
0352仕事人 ★
垢版 |
04/02/29 15:16ID:???
>>346
おおっ
0353仕事人 ★
垢版 |
04/02/29 15:18ID:???
変更

if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum > 1010)
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
if($lognum > 999)
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
else
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
}
0355GlobalService ★
垢版 |
04/02/29 15:23ID:???
解決した?

最終的に subject <= 実際のカウント になればいいような
0356動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 15:23ID:genUmBmg
datの読み込みを2回やってるんですね〜……。
レスの書き込みとレス数の取得を同時にやる(>>353 の処理を >>350 に持ってくる)のがいいかも。

……大手術(汗)。
0357サザン ★
垢版 |
04/02/29 15:24ID:???
>>354
おいらもそう思ったですよ。

chmod 0555 しても、追っかけてきてるプロセスが chmod 0666 しちゃって、
そのプロセスが、chmod 0555 しても。。。

chmod 0666 を消したら解決だったりして。
0359root ★
垢版 |
04/02/29 15:39ID:???
でかける前に見た。
こりゃ、>>354がビンゴな気が。
でなきゃ、いくらひどいじょーきょーでも、4000とかいく原因とは考えにくい。

しばらくオフライン。たまーにPHSでチェックするかも。
0360サザン ★
垢版 |
04/02/29 15:40ID:???
というわけで、live8,9に

chmod(0666, $DATAFILE);

を消したやつを入れてみてくださいですー。
0361 ◆qb.x27/m96
垢版 |
04/02/29 17:18ID:W0afuNnL
>>353
処理の順番が。。
これでどですか。


if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
++$lognum;
}
0362 ◆qb.x27/m96
垢版 |
04/02/29 17:53ID:W0afuNnL
訂正。。


if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
chmod(0555, $DATAFILE);
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
}
0363動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 18:21ID:VrFyjLpJ
>>351
テレビ朝日実況板より
スクープスペシャルその1 (1001)
http://live8.2ch.net/test/read.cgi/liveanb/1078030448/
1000 名前:名無しステーション 投稿日:04/02/29 14:52 ID:gFLAwWAx
(1001無し)

スクープスペシャル 警察の裏金疑惑第2弾 その2 (1000)
http://live8.2ch.net/test/read.cgi/liveanb/1078030554/
1000 名前:名無しステーション 投稿日:04/02/29 15:20 ID:LyiRwuOt
(1001無し)


この間に加えた修正によって、subject.txtに書かれるレス数と
実際のレス数が一致するようになりました。ありがとう!
0364 ◆qb.x27/m96
垢版 |
04/02/29 18:50ID:W0afuNnL
#ERROR!
#ERROR:このスレッドには書けません!

#修正ここまで。
# "ERROR:このスレッドには書き込めません。緊急緊急緊急!!" が出てこないけど今ソースはどうなってるのだろう。。


if (open(OUT, "+>>$DATAFILE"))
{
my @logdat = <OUT>;
my $lognum = @logdat;
++$lognum;
if($lognum = 1000) #正常処理
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
chmod(0555, $DATAFILE);
}
if($lognum > 1000) #非常時処理
{
close(OUT);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
print OUT "$outdat\n";
}
else if($lognum < 1000) #1000未満時処理
{
close(OUT);
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
}
0367仕事人 ★
垢版 |
04/02/29 19:27ID:???
なぜ 1,001 が書き込まれないんだ?
0368動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 19:33ID:genUmBmg
1001ストッパーが書き込まれないのは
・プロセスAが >>353 で1000レス目を書き込む
・プロセスBが >>330 で(1000レス以上なので)chmodする
・プロセスAが1001ストッパーを書き込もうとするもEPERM
と予想してみる。

ということで、>>353
if ($lognum > 1010) {
close(OUT);
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
にして、>>330 の chmod(0555, $dattemp); を削除する、というのはどうでしょ。
0370仕事人 ★
垢版 |
04/02/29 19:48ID:???
これ全部いらないのか?

if(-w $dattemp && $lognum > 999){
#open(OVER, ">>$dattemp");
#print OVER "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
#close(OVER);
#chmod(0555, $dattemp);
#$lognum++;

if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
}
0371仕事人 ★
垢版 |
04/02/29 19:49ID:???
いったい何をしているルーチンなんだろぅ
0372動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 20:11ID:aErj63/K
ファイルロックの名残?
総帥に事情聴取してからにしてください。
こないだのiスクリプト消滅騒ぎのような事態は避けないと。
0373動け動けウゴウゴ2ちゃんねる
垢版 |
04/02/29 20:12ID:2mqLuO2T
あらためて
・複数のプロセスが999レス目のつもりで書き込む→1000オーバー(ただしストッパーは書かれない)
・1000オーバーなので >>330 でchmod
と予想してみる。

ってことで、>>330 の1001ストッパー書き込みも復活すれば……。
……泥縄だなぁ。
0375 ◆qb.x27/m96
垢版 |
04/02/29 20:17ID:W0afuNnL
ええとこれとまったく同じメッセージが書いてある部分のソースがないのですがどの部分でしょうか
 ↓
ERROR:このスレッドには書けません!


あと $outdat っての値が代入されている部分のソースもないし。。
0377 ◆qb.x27/m96
垢版 |
04/02/29 20:24ID:W0afuNnL
ええとこういう風になっているはずなのですけど。

DispError("ERROR!","ERROR:このスレッドには書き込めません!");


----
ERROR!
ERROR:このスレッドには書けません!
■ このスレッドは過去ログ倉庫に格納されています

ニューススポーツなんでも実況