bbs.cgi再開発プロジェクト 3
■ このスレッドは過去ログ倉庫に格納されています
いろんなとこにフラグ立てまくって出力させてみてほしいです どこが実行できていて、どこができてないのかよく分かんない >>404 のレス数チェックが効いてるかどうかは、このスレに1回書き込むだけで判明するかな、と。 http://qb.2ch.net/test/read.cgi/operate2/1068621844/ このスレがいま350レスなので……。 ん? もう解ったんでないのか? 違うところで戦っていたということが、 ひょっとしたら my @logdat = <OUT>; の前に seek(OUT, 0, 0); を入れるといいかも(←自信なし)。 うちのwindowsだと、 if (open(OUT, "+>>$DATAFILE")) { #この時点でファイル末尾にseekされてる my @logdat = <OUT>; my $lognum = @logdat; これだと@logdatは空になっちゃうんだけど、、、 if (open(OUT, "+<$DATAFILE")) my @logdat = <OUT>; my $lognum = @logdat; じゃないすかね >>436 うちのcygwinだと"+>>"でopenした時点でファイル先頭にseekされてました。 あと、追記モードじゃないと書き込みがぶつかったときにヤバいです。 なんか…ニュー速+も1001ストッパー壊れてるのね。 なにがなんだか… >>433 ええと>>330 に手を加えていたものが>>350 で その後>>353 でテストして>>330 あたりに戻ったということなのかな。。 どのソースを元にやればいいのか、、 ちょっとゆっくりやってほしい、、 今試したら、Windows(ActivePerl)でもsysopen使ったら先頭だった。 >>249 だけど、>>438 と同様、 cygwin+perl5.8.2で、読み込み時は先頭から 同じくlinux(redhat8かな)+perl5.8.0でも。 思ったんだけど bbs.cgiを置き換えちゃうと不具合が出たときに面倒だし 変数を表示しようとしてもなかなか難しい。 そこで、bbs_test.cgiにして実験する。 で、こいつにPOSTするのも面倒だから POST先だけを変えたread_test.cgiを作り テスト用の鯖に入れる。 で、書き込みテストはそっちでやって、内部の変数や状態をずらずらと表示する。 ただ、1000到達時のテストは難しいかな。 open(OUT, ">>$DATAFILE"); print OUT "$outdat\n"; close(OUT); dat 追記部分は元にもどす。 そして、 ここに持ってくる 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($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { open(OUT,"<$dattemp"); print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } >>447 を見て気づいたこと。 ・「緊急緊急緊急!!」が書き込み終わった後になる ・1001ストッパー書き込み時のオープンモードが読み込みモード >>453 ども 、 直してみた if($lognum > 1010) # ここはこないと予想 { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { open(OUT,">>$dattemp"); print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } >>447 open(OUT,"<$dattemp"); print OUT "1001<><>Over 1000 Thread<>この 鰓がでるよね? もっと餅付いてくだちい。。。 chmod(0666, $dattemp);がchmod(0555, $dattemp);よりあとに実行されるとは考えにくいけど、 念のため、 if($lognum > 1010) { chmod(0555, $dattemp); DispError("ERROR!", "ERROR〜"); } としてもいいかも。 ウスターの一部しか開示されないので 処理の流れがわからない。。。 あと、別のところで問題がある場合も 思い込んでる場所のみを開示&思考なので発見が遅れる。。。 な予感('-') if (open(OUT, "+>>$DATAFILE")) { my @logdat = <OUT>; my $lognum = @logdat; ---- この部分ですけど実際にファイルをopenしているのはどこなんだろう、、 そして$outdat には何が入っているのだろう、、 こんな風に変更したら、どですか。>>330 と思ったらまたやり直し、、、 subback.htmlが1000になってるのはいいのかな? 1000超えたスレッドをreadonlyにするってことですかな。 >>468 あー、1001ストッパー書き込み時に++$lognum;が必要ですね……。 open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { open(OUT,">>$dattemp"); print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); chmod(0555, $dattemp); $lognum++; } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } >>457 #パーミッション調整 umask(0); chmod(0666, $dattemp); って必要なの? $SUBLINE = $subject . " (" . $lognum . ")\n"; $SUBLINE がグローバルになっていて あとで subject.txt を更新するのに使うと予想。 オープンソースは荒らしに利用されるからダメだそうな >>445 実況板だったらテストでいちなり導入してもOk。 というのが2chノリ 未承諾さんあたりを拉致して缶づmうwあおまえなにすrあwせdrftgyふじこlp;@ 作り直したほうが性能よくなるけど管理人が弄れなくなるからいまのやつ使ってるんだよな>bbs.cgi たぶんバイナリ化せずにソースを入れてるんじゃないかと。 バイナリ化するのはroot ★さんの仕事。 悪いことは言わん。 1000チェックだけでも、別ロックファイルとして*.dat以外にしないとchmodヘルになると思う。 ファイルI/Oを嫌って1ファイルでゴニョゴニョしているほうがパフォーマンスが悪くなると思う。 ERROR! ERROR:このスレッドには書けません! --- >>491 のスレは1000のチェックではなくてパーミッションチェックで弾かれている予感。 あとは高負荷がかかった時でも大丈夫ならOKなのかな、、 ↑ 1000行ってしまった後にあらため書き込もうとした時の話です。 なんかあまり役に立てなかった悪寒 _| ̄|○ >>498 subject.txtが1002になってる >>498 subject.txtではレス数が1002になっている……。 ミナカッタコトニシヨウ 1000越え判定の時の$lognumに直接1001を叩き込んじゃだめですか?>判るひと >>502 それ以前に本文書き込み動作が畳み込まれているので、、、(哀) if($lognum > 999) { if (open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } chmod(0555, $dattemp); } これでどうでしょ。 >>502 レス数がきっかり1000で止まる保証がないので、直接1001をいれるとマズいです。 >>503-504 サンクスコ。 むうー。修行しよう。 >>504 そね #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } まとめ(メモメモ) 処理の流れは 1) とにかく色々チェック。 2) dat に追記。 3) MakeWorkFile で html/xxxxxx.html を作る この時に 1,000 超えを判定、 1,001 を書き 0555 にする。 この関数内で $SUBLINE = $subject . " (" . $lognum . ")\n"; を作りあとで subject.txt の書き換えに使う。 4) subjext.txt 書き換え 5) ふぅ終了。 問題は 2) で追記したあと 0666 にしていたので せっかく 0555 で書き込めなくしたのに書き込めていた。 あと bbs.cgi の最初のほうで unless( -w $DATAFILE){ DispError("ERROR!","ERROR:このスレッドには書き込めません。"); } を行い、なるべく負荷をさげようと。 大幅なオーバーランはなくなったか → たぶん 前よりも処理は軽くなったか? → たぶん 要観察ですなぁ なんか、あまり変わってない気がするのは気のせいに違いない。 #dat追記部分 if (open(OUT, ">>$DATAFILE")) print OUT "$outdat\n"; close(OUT); } else { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } #ログのカキコ数を取得 if($lognum > 1010) { chmod(0555, $dattemp);#念のため } elsif($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); $lognum++; } chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } にしたほうがいいかも。 最大書き込み数がてんでばらばらなのはなんとか ならないのか? 全レス取得できたのかどうか,すっきりしないんだが。 >>484 >オープンソースは荒らしに利用されるから 誤解されるようなことを振りまかないでー。 ApacheやFreeBSDはオープンソースですが荒らしに利用されていますか? こうしたらどうなる? open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); #ログのカキコ数を取得 $lognum = @logdat; if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n"; close(OUT); #$lognum++; open(RDAT,"<$dattemp"); @logdat=<RDAT>;#ログを配列に読み込む close(RDAT); $lognum = @logdat; } chmod(0555, $dattemp); } else { #パーミッション調整 umask(0); chmod(0666, $dattemp); } >>515 レス数のカウントがより確実になって、ちょっと重くなる? 各種cgiテスト専用の板を作ったほうがよさげな悪寒。 >>517 いちおう運用情報(金)がそれにあたってます。 でも、1000レスとかそういった実験にはむかんとですよ。 >>515 その「ログのカキコ数の取得」ルーチンがレス書き込みより後にある限り はほとんど変わらないと見た 悪い 上のログ読まずに書いてしまった いろいろいじった後だったのね if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } if($lognum > 999) { if(open(OUT,">>$dattemp")) { ここを if($lognum > 999) { if($lognum > 1010) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"); } else { if(open(OUT,">>$dattemp")) とかだめかな。 >>521 if($lognum > 999) { DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!") if($lognum > 1010); if(open(OUT,">>$dattemp")) { ・・・書いてみたかっただけなの 昨日は本業超多忙につき、>>360 から未処理。 急ぎで何かしなきゃいけないことある?live8/live9のbbs.cgiの更新とか。 12:00ごろまた来るので、誰かレス番で教えてちょ。 # 午後は少し時間とれる見込み。 ERROR! ERROR:このスレッドには書き込めません。緊急緊急緊急!! ホスト* 名前: 2chtubo愛用者〜ヘ(゚д゚ヘ))))))〜61 ◆2CHTUBOC5A E-mail: 内容: きねんかきこ。 こちらでリロードしてください。 GO! 分からないことがあったら2ちゃんねるガイドへ。。。 ------------------------------------------------------- ちゃんとでてるね。。。 >>522 前 if と後ろ if を混ぜたらややこしいがな と、思ったら、書きこまれてるし。だめじゃん、仕事人。 警察板( http://society.2ch.net/police/ )が困った状態なので、お知らせしておきます。 subject.txt上は1011なのに、実際は2000オーバースレ有り (IEで)各スレッドURLでは、1001ストッパーまで表示、書き込み欄なし (〃)板トップでは、実際の最終レスまで表示、書き込み欄あり (専用ブラウザで)スレ一覧のレス数がずれるものの、書き込み可能 http://society.2ch.net/test/read.cgi/police/1058340116/2917 など ちなみに、レス数1000近くのスレをageて、次々にお祭りを始めているようです。 http://society.2ch.net/test/read.cgi/police/1040783990/962 他板で宣伝も見つけました。 http://live8.2ch.net/test/read.cgi/livenhk/1078104752/190 つまり >>519 かつ 999 判定より 1010 判定が前にあるせいで 書き込まれてから緊急緊急が出てるわけだな >>523 急ぎで society の bbs.cgi を元に戻してくださいw ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる