【问题标题】:Creation of new process for each request of web page?为每个网页请求创建新流程?
【发布时间】:2011-07-07 11:56:07
【问题描述】:

这可能是一个基本问题,但每次用户从服务器调用 php 文件时,它是否会从该服务器创建一个新进程?

例如,我有一个将文本提交到另一个 php 文件的基本表单(比如在 index.php 上)。 在那个 php 文件中,我打印了 posix_getpid()。

我在两个选项卡中打开了我的 index.php 并填写并提交了一个文本,我最终得到了 每个选项卡上有两个不同的 pid。

这使我得出结论,服务器可能为每个脚本创建一个新进程。 我说的对吗?

干杯!

【问题讨论】:

    标签: php process pid


    【解决方案1】:

    我假设您正在运行 apache 作为您的 Web 服务器。

    当一个请求进来时,apache 启动一个新线程。然后在这个新线程上调用 PHP,因此每次都会获得一个新的进程 ID。

    当然,这已经大大简化了。

    我建议阅读this 文章以获得更深入的了解。

    编辑:似乎平台之间的过程有所不同。它在 Windows 上按照我上面描述的方式工作,但在 Unix 上执行多个 apache 进程。

    【讨论】:

    • 好吧,是因为 apache。但是你的解释对我来说有点奇怪,因为线程和进程是完全不同的。我的意思是,如果 apache 启动一个新线程,这意味着每个 php 脚本都应该有 apache pid !
    • 不,PID来自新创建的PHP实例,而不是apache进程。
    • 只是看看我是否明白这一点,每次调用 php 脚本时,apache 都会创建一个新进程来处理 unix 系统上的该 php 脚本。
    • 当他说“新线程”时,我也很困惑。每个进程都有一个主线程,所以我认为他的意思是每个请求都会创建一个“新主线程”,因此会创建另一个进程。
    • PHP 进程究竟是什么时候开始的?在网络服务器获得完整的请求正文之后还是在传输开始时?
    【解决方案2】:

    有多种方法可以使用 PHP 链接 Web 服务器。

    对于Apache HTTP Server,最受欢迎的是“mod_php”。这个模块实际上是 PHP 本身,但被编译为 Web 服务器的模块,因此它被直接加载到其中。由于使用 mod_php,PHP 会直接加载到 Apache 中,如果 Apache 打算使用其 Worker MPM(即使用线程)来处理并发

    这是setlocale()之类的陷阱。

    使用Nginx,您将无法选择将 PHP 嵌入其中。因此,PHP 完全在具有多个 PHP processes 的 Web 服务器之外。

    这很好,因为 PHP 可以做一些低级的事情,比如改变 locales 而且setlocale() 不是线程安全的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-15
      • 1970-01-01
      • 2016-08-07
      • 2011-05-15
      • 2015-07-25
      • 2014-09-04
      • 2016-09-22
      相关资源
      最近更新 更多