2016-07-06 62 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,但例如:

  • 使用消息队列:每个进程将数据发送到消息队列(在另一个进程),将尽快它可以处理它,但不延迟请求处理。
  • 使用面向服务的体系结构,其中每个进程将请求路由到服务,例如数据库或对象持久层。