bbs.cgi再開発プロジェクト 3
■ このスレッドは過去ログ倉庫に格納されています
↑
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 >>528
society(=oyster17)って、私ログインできるのかな。 ログインできにゃいのか?
つーかもしかして全板この仕様なのか? でもよく読むと 515 のとおりなら 1010 判定のあとに 999 判定も
通ってるはずだから、止まるんじゃないのかな?
&DispError って、中で exit してるのかな 変更してみる
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp);
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);
}
close(OUT);
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
のほうがいいかも (´-`).。oO(いつdatに書き込んでるんだろう…) >>537
(´-`).。oO(たぶん別の場所でやってて、そこは今大人の都合で書いてないだけなんだよ、とか言ってみるテスト。) >>539
ご苦労様です。
お茶でもどうぞ。
ζ
旦 ⊆⊇ んで
現状は 1,000行ったスレッドは
dat = 1,001 まである
index.html = 1,000 までしか出ない(以前と使用違うけど、がまんの方向で)
subject.txt = 1,001 まである
今回の改修の目的は
2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
なのでどうなるか観察しよう。 >>541
>2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
何が何でも1,000ぴったりで止めるのか
1050ぐらいまで放置するか決めよう
>>542
1,000 「近辺」というぐらいだから1050でもアリじゃないかな……。 ちょっとくらいはオーバーしてもいいという方針だったと思うのだが、、
過去ログorソースコード読んだ? 1000を書いたbbs.cgiさんが、責任持って1000ストッパーを書いて、
chmod/fchmodしてから終わる、というのはどうなんでしょう。 それに挑戦したのが >>255 あたりからだったりして、 >>545
それだと「999を書いたbbs.cgiさん×2+1001以降を書くbbs.cgiさん」な場合に
ストッパーが効かなくなる気がするです。 >>548
そっか。当然そうだよね。
なんだか、某DJBに「フーン」って笑われそうな議論だよなぁ。ここでのあがきって。
もちろん、私も含めて。 1000 近くになると
my @logdat = <OUT>;
のコストがバカにならないんだよね
読み進めてる間に他のプロセスがガンガン書いてる
やっぱ 1 レスにつき 1 バイト追記するレス数ファイルを
持つのがいいんじゃなかろうか *.datでなんでもかんでもやろうとしないで、専用ロックファイルに任せたほうがかえって早くなるに一票。
大改造しているところ大変申し訳ないのだが、
単純に最初のソースの
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
の部分を
if($FORM{'subject'} ne ""){#新規スレ立て時
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
とすればいいような気がする。 >>559
>>534 かと。
それなら一回555にしたパーミッションが戻ることもないし。
とPerlよく知らないけど口出ししてみる。 >>558
なるほど。パーミッション調整って新規作成したときのものだったのか。 >>558
もとのソースだと書きこみが失敗したときでもchmod(0666,)が実行されてたみたい?なので、
if (open(OUT, ">>$DATAFILE"))
print OUT "$outdat\n";
close(OUT);
} else {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
これだけでもいいかもしれない。 DATファイル作成後、DATファイルが666で変わらなければ、レス追加時に666を
設定するのは意味が無いし、>>357 >>508にもあるように、555にしたファイル
が666に戻るのは元々想定していないと思います。
DATファイルが666で変わらないことは、実際のDATファイルや全てのソースを
見ないと分からないので、分かる方お願いします。 >>563
FTP で入って chmod 555 しようとおもったら
permition ないって怒られた。
だれの持ち物になっているんだ?
良く起こることなのか?
たまたまなのか? 1000を超えていることを示すファイルを別に作るのは駄目ですか?
if (1000越ファイルアリ)
{
}
else
{
if (1000超えた) {
1000越ファイル作成
}
}
1000超えファイルを物凄い勢いで更新する悪寒(素) >>567
cgiから作成されたファイルはcgi経由でないと変更出来ない場合ありです。 >>562は{が抜けてた。
if (open(OUT, ">>$DATAFILE"))
{
print OUT "$outdat\n";
close(OUT);
}
else
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
} CGI のプロセス ID 付き書き込みデータを、書き込みやさんに渡す。
書き込みやさんから、その結果を SIGNAL として呼ばれるのを待つ。
成功したら SIGUSR1 とか失敗したら SIGTERM とか。(現状の bbs.cgi では SIGNAL は単純に exit; ですよね?)
でもって 10 秒以上経過しても結果が帰ってこなかったら、DispError("ERROR!","ERROR! (゚∀゚)アヒャヒャヒャヒャ")
せっかくのうに環境なんだから。。。 >>573
OJDでテストしてみたら、書けちゃいました・・・
これを試してみてくれないかなぁ。。。
----
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
chmod(0555, $dattemp);#←ここに、これ入れたらどですか
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
if($lognum < 1000)#666は1000以下で
{
umask(0);
chmod(0666, $dattemp);
}
} >>578
DispErrorはexitするので、2つ目のchmodは実行されないです……。 >>579
あらら直前にあるのに今気がついた。。。
もう少し考えてみますです。。 if($FORM{'subject'} ne ''){#新規スレ立て時
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
これも組み込んだらいいかと >>558でいいと思うんだけど、通常の書きこみ時にsubjectが送られたときのことを考えて、
>>562と合わせて、
if(!-e $DATAFILE){
1の書きこみ&パーミッション調整
}elsif(open(OUT,">>$DATAFILE")){
通常の書きこみ
}else{
エラー
}
でどうか。
ところで、今どれが入っているの? if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp) or DispError("ERROR!", "ERROR:chmodできないよ?緊急緊急緊急!!");
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
chmod(0555, $dattemp)が失敗してるのか、
それともどこかで666にchmodされてるのか調べてみるとか >>567
suexecって、たまに「抜けてくる」ことがあります。
ひょっとして、chmod()できないのって、それが原因? うーん
実況の各板たらーっと見てきたけど 1,001 で止まっているなぁ
>>563
のスレッドだけの問題なのかどうなのか。 もちろんまずは自分を疑えってことで
それは見てみたのでしたー >>590
もしかしてnews6/news7配り忘れていない どうだろ、、
自動で配布しているからなぁ
version 番号付けて配ってみるです < こんど 警察板
ERROR:このスレッドには書き込めません。緊急緊急緊急!!
のエラーはでますが、いくらでも書けますよ
>>567
oyster100/200/900番台ならroot師におながいしてchownしてもらえばいいのではないかと。 if (-e $DATFILE && (!-w $DATFILE || -s _ > 512 * 1024)) {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
#中略
my $lognum = 0;
if (open(IN, "< $DATFILE")) {
$lognum = (join('', <IN>)) =~ tr/\n/\n/;
close(IN);
}
if ($lognum > 1010) {
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}else{
if (-w $DATFILE && open(OUT, ">>$DATFILE")) {
print OUT "$outdat\n";
++$lognum;
if ($lognum > 999) {
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
++$lognum;
close(OUT);
chmod(0555, $DATFILE);
}
close(OUT);
}elsif (!-e $DATFILE) {
# スレ立て処理
chmod(0666, $DATFILE);
}else{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
}
#(´-`).。oO(テストまでしちゃったよ…) ■ このスレッドは過去ログ倉庫に格納されています