データ書きこみ

[上に] [前に] [次に]
yasu [E-Mail] [HomePage] 1999/09/10(金) 15:55:41
こんにちは。yasuです。前回、忙しくておれいが言えませんでした。
すみませんでした、そしてありがとうございました。
高校受験は大変です(謎)

CGI(Perl)でのデータ書きこみについてですが、書き込み中に、
ユーザー(訪問者)がブラウザの中止ボタンを押すと、
書き込み中のスクリプトは、途中で書きこみをやめて、
その後のデータは、消えてしまうのでしょうか?

友達から、まずは違うファイルに書きこんで、その後
本物へ上書きコピーするとよいと聞いたのですが、
そのほうがよいのでしょうか?

ちなみに、データはテキストファイル100KBぐらいです。
サーバーに負担かけていそうです(^^;)
いまは、
print OUT @datas;
または、foreachで1行ずつ出力して、
書きこんでいます。そのうち消えないか心配しています・・・

それでは。

mizna [E-Mail] 1999/09/10(金) 18:41:18
> そのほうがよいのでしょうか?
掲示板を作っていると仮定しますが、
もしも同時に多人数がそのファイルにアクセスすると、
タイミングが悪いとすべてのデータが消えてしまいます。
ですから、通常は別のファイルをロック処理を使って書き込む、
ということを行います。

> データはテキストファイル100KBぐらいです。
これはマズいです。
全部読み込むにしてもサーバに負担がかかりますし、ユーザもCGIの応答が遅くて
イライラしてしまうでしょう。
一部(先頭)を読み込む程度であれば問題ありませんが。

> print OUT @datas;
これは全く問題ありません(たぶん)。

ちなみに大学受験はもっと大変です。
高校入試もそうですが、高校に入ってからが勝負ですよ。
よけいなお世話ですが。

わかりにくくてすみませんでした。

B-Cus 1999/09/10(金) 19:00:05
> 書き込み中に、ユーザー(訪問者)がブラウザの中止ボタンを押すと、
../199909/99090031.htm

排他処理に関しては、「ロック」で過去ログを検索すること。

yasu 1999/09/10(金) 23:22:48
>全部読み込むにしてもサーバに負担がかかりますし、
>ユーザもCGIの応答が遅くてイライラしてしまうでしょう。
それがなぜかはやいんです??
http://info-club.net/Yasu/
ここなんですけれど。
負担ってすごくかかりますかねぇ?

>排他処理に関しては、「ロック」で過去ログを検索すること。
そのとうりにやってみました。
flockが使えたら、flockが一番よい、また、書きこみ時は、
.tmpなどに書きこんでから、コピーするとよいと、
とほほさんの意見で書いてありました。
flockが使えるか試してみて、やってみます。
(一番知りたかったのは、.tmpにまず書きこんだほうがよいかということなのですが)

ありがとうございまいた。

とほほ 1999/09/10(金) 23:48:41
> .tmpにまず書きこんだほうがよいかということなのですが

 ケースバイケースだと思います。データのアペンド(追加)しかしな
いのであれば、ロックさえかけていれば、データが壊れる可能性は少な
いです。

 データの書き換えを行う場合は、一度、データファイルの中を空にし
てしまうので、この時にプログラムが異常終了すると、データは消えて
しまいます。

(1)tmpおよびtmp2が残っていれば、(4)〜(6)を行った
   あとで(2)を実行する。
(2)データをtmpに書き込む。
(3)中身は何でもよいのでtmp2を作成する。
(4)元ファイルを削除する。
(5)tmpを元ファイルにファイル名変更する。
(6)tmp2を消す。

などの処理を行えば、ファイルが壊れてしまう危険性を少なくすること
ができるようになると思います。

とほほ 1999/09/10(金) 23:50:57
あ、(1)と(2)の間に「tmp2を消す」が必要だな・・・

B-Cus 1999/09/11(土) 07:21:01
>> print OUT @datas;
> これは全く問題ありません(たぶん)。
よりは
> または、foreachで1行ずつ出力して、
の方がいいでしょ。一気に @datas にブチ込むよりは1行ずつの方が速い。

> それがなぜかはやいんです??
そういう感覚でサーバへの負荷を語るのはどうかなぁ…。

PIII-dualなら速くて486なら遅いのは当然だし、
メモリ多けりゃ速くて少けりゃ遅いのも当然でしょ?

いや、あなたが「体感速度が速けりゃOK」という考えを持ってるなら
それはそれでいいんだけれど。

yasu 1999/09/11(土) 09:44:46
>> または、foreachで1行ずつ出力して、
>の方がいいでしょ。一気に @datas にブチ込むよりは1行ずつの方が速い。
そうなんですか!!スクリプトを見なおしてみます。

とほほさんの方法ですが、これでやってみたいと思います。
tmpには、別にロックが必要ですよね?
あと、読みこみロックはどうやれば最善でしょうか?
読みこみ時も、書きこみ時と同じように、tmpが残っていれば
コピー&tmp2作成・削除が必要ですよね?
また、sigexitなどには何を記述したら良いですか?

[上に] [前に] [次に]