2016-07-06 6 views
2

Apache、LinuxでC++を使用した簡単なWebプログラミングを行っています。私はsignup.cgiと呼ばれるCGIスクリプトを作成しました。このプログラムは、ブラウザからの入力を取得し、users.txtというファイルにデータを書き込みます。cgiのプロセス処理

私の質問は2人のユーザーがsignup.cgiにアクセスしたとき、ある、それは2つの異なるプロセスまたは唯一のプロセスを作成するのでしょうか?

ケース1:users.txtにアクセスするプロセスは2通りありますか?

User1 ----> singup.cgi -----> Pid1 ----> users.txt 
User1 ----> singup.cgi -----> Pid2 ----> users.txt 

(または)

ケース2:users.txtにアクセスするための唯一の方法だろうか?これは、2つの異なるプロセスが同じ時間にusers.txtにアクセスしている場合

User1 ----> singup.cgi -----> Pid1 ----> users.txt 
User1 ----> singup.cgi -----> Pid1 ----> users.txt 

users.txt内のデータが破損している可能性があります。この問題をどのように処理できますか?

それはusers.txtにアクセスするための唯一の方法である場合、私は私が得ることが問題となっているのか分からないのですか?

+1

pidをファイルに書き込もうとしましたか? – Christophe

+0

あなたはusers.txtを意味しますか? –

+1

はい、正確です!またはログファイル – Christophe

答えて

0

プロセスのApacheの使用は、あなたのサーバーとCGI「スクリプト」が設定されている方法によって異なります。 RFC 3875によると:

  • サーバによって呼び出されるCGI「スクリプト」は、スタンドアロンプ​​ログラム、 動的にロードされるか、共有ライブラリ、(Apacheソフトウェア)サーバー、または解釈されるスクリプトでサブルーチン可能(セクション1.4を参照)
  • "CGIの最も一般的な実装では、サーバプロセスと同じユーザとグループを使用する子の子として プロセスを呼び出す。"(9.5節参照)。しかし、プロセスのプールを管理するFastCGI variantは、リクエストごとに新しいプロセスを起動するオーバーヘッドを回避します。
  • スクリプトはステートレスでなければなりません。セクション9.7を参照してください:

をウェブのステートレスな性質は、複数の要求を単一の概念 Webトランザクションを構成する場合でも、すべての 、他の独立したスクリプト実行とリソースの検索を行います。このため、スクリプトは 要求を提出するユーザエージェントの文脈についての 仮定を作るべきではありません。

スケーラブルな操作であなたは多くのApacheサーバの1、およびApacheサーバにそのルート着信HTTP要求をロードバランサを有することができると思い、この基本的な勧告を強化するために、1つまたは複数のFastCGIのサービスのためにルート要求をできました。あなたが無国籍者と考えるなら、あなたは安全です!結論でそう

:CGIプログラムにあなたがプロセスやユーザー(あなたが一緒に関連する要求を置くために持っている場合は、セッションを管理する必要がある)については何も仮定することはできません。

はい、複数のプロセスが同じファイルに同じ瞬間に書き込みを行うと、ファイルに実際のゴミが入る可能性があります。それを管理するには、OSレベルinterprocess synchronisation mechanismsを使用する必要があります。セマフォまたはファイルロックはファイルアクセスをシーケンシングすることができますが、パフォーマンスは低下します。メモリにマップされたファイルは、より簡単な方法で役立ちます。

しかし、この制限を克服するには、建築的な量子の飛躍を達成する必要があります。話題はここで開発しすることがあまりにもbroeadですが、例えば:メッセージキューの

  • 使用:各プロセスは、できるだけ早くそれができるようにそれを処理します(別のプロセスでの)メッセージ・キューにデータを送信します要求処理を遅延させることはありません。
  • サービス指向アーキテクチャーを使用します。サービス指向アーキテクチャーでは、各プロセスが要求をサービス(たとえば、データベースまたはオブジェクト・パーシスタンス・レイヤー)にルーティングします。
関連する問題