【问题标题】:Process Handling in cgicgi中的进程处理
【发布时间】:2016-07-06 05:23:19
【问题描述】:

我在 Apache、Linux 中使用 c++ 进行简单的 Web 编程。我创建了一个名为signup.cgi 的cgi 脚本。该程序从浏览器获取输入并将数据写入名为users.txt 的文件中。

我的问题是,当两个用户访问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.txtusers.txt中的数据将会损坏。我该如何处理这个问题?

如果只有一个进程访问users.txt,不知道会遇到什么问题?

【问题讨论】:

  • 你尝试过,将 pid 写入文件吗?
  • 你的意思是在 users.txt 中吗?
  • 没错!或在日志文件中
  • @Christophe:我从你的问题中理解了这个概念。谢谢。
  • 我认为,并且很高兴得到纠正,您的问题的答案是,这取决于您的网络服务器的设置方式。一般来说,简单的情况下,每个客户端都会有不同的进程,但如果你使用FastCGI 或类似的,两个用户可以由单个进程的线程处理。

标签: c++ parallel-processing cgi


【解决方案1】:

Apache 对进程的使用取决于您的服务器和 CGI​​“脚本”的配置方式。根据RFC 3875

  • 服务器调用的 CGI“脚本”可以是一个独立的程序,一个 动态加载或共享库、(Apache 软件)服务器中的子例程或解释脚本(参见第 1.4 节)
  • "最常见的 CGI 实现将脚本调用为子脚本 进程使用与服务器进程相同的用户和组。"(参见第 9.5 节)。但是管理进程池的FastCGI variant 避免了为每个请求启动新进程的开销。李>
  • 脚本应该是无状态的。见第 9.7 节:

Web 的无状态特性使得 每个 脚本 执行 和资源检索独立于所有 其他即使多个请求构成一个概念 网络交易。因此,脚本不应使任何 关于用户代理提交的上下文的假设 请求。

为了强化这一基本建议,请考虑在可扩展操作中,您可能有一个负载平衡器,它将传入的 http 请求路由到多个 apache 服务器之一,而 apache 服务器可以将请求路由到一个或多个 FastCGI 服务。如果您认为无国籍,您将是安全的!

因此,总而言之:在您的 CGI 程序中,您不能对进程和用户一无所知(如果您必须将相关请求放在一起,则必须管理会话)。

是的,如果多个进程同时写入同一个文件,您的文件中可能会出现真正的垃圾。您必须使用操作系统级别 interprocess synchronisation mechanisms 来管理它。信号量或文件锁可以使文件访问顺序化,但会降低性能。内存映射文件可以以更简单的方式提供帮助。

但要克服这一限制,您必须实现架构上的飞跃。这个话题太宽泛了,这里就不展开了,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 2015-08-09
    • 2012-03-23
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多