2016-07-06 38 views
2

我在Apache,Linux中使用C++進行簡單的web編程。我創建了一個名爲signup.cgi的cgi腳本。該程序從瀏覽器獲取輸入並將數據寫入名爲users.txt的文件中。cgi中的進程處理

我的問題是,當兩個用戶訪問signup.cgi時,它會創建兩個不同的進程還是隻有一個進程?

案例1:這是兩個不同的過程訪問users.txt

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

(或)

案例2:會不會是隻有一個進程訪問users.txt

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

如果這是兩個不同的過程在同一時間訪問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事務。因此,腳本不應對任何 假設有關用戶代理提交請求的上下文。

爲了加強這個根本的建議,認爲在可擴展的操作,你可以有一個負載均衡的路由傳入的HTTP請求,許多Apache服務器中的一個,和Apache服務器可以將請求路由到一個或幾個FastCGI的服務。如果你認爲無國籍,你會安全的!

所以總之:在你的CGI程序中,你不能對流程和用戶不做任何事情(如果你必須把相關的請求放在一起,你必須管理會話)。

是的,如果幾個進程在同一時刻寫入同一個文件,你可能會在你的文件中得到真正的垃圾。您必須使用操作系統級別interprocess synchronisation mechanisms來管理該操作。信號量或文件鎖可以順序化文件訪問,但會降低性能。內存映射文件可以幫助更容易。

但是爲了克服這個限制,你必須實現體系結構的飛躍。該主題過於broead在這裏developped,但例如:

  • 使用消息隊列:每個進程將數據發送到消息隊列(在另一個進程),將盡快它可以處理它,但不延遲請求處理。
  • 使用面向服務的體系結構,其中每個進程將請求路由到服務,例如數據庫或對象持久層。