PHP 脚本本身算一个进程吗?

PHP 脚本本身算一个进程吗?

我的服务器可以处理的并发进程数量有限(20)。为了确保不超过这个数量,我需要了解:

  1. 当用户等待 PHP 脚本完成加载时,全部的等待时间算作一个过程吗?

  2. 等待脚本完成的大部分时间是沟通通过 cURL 与远程服务器...我相信大多数时候都很简单等待等待服务器响应数据。连接到远程服务器的整个时间算是一个过程吗?

我负责处理付款,需要确保没有人被切断。脚本通过 mod_fcgid 运行。

答案1

这一切都取决于情况。

如果您的服务器运行的是带有 mod_php 的 Apache,那么您的 PHP 脚本将与 Apache 进程一起运行,并算作一个进程(Apache 为该 HTTP 请求运行的进程)。但是,如果您的脚本使用系统调用来使用外部程序,那么它自然会产生新进程并运行它们。值得注意的是,在 mod_php 下,每个脚本都使用 Apache 正在运行的用户 ID 运行,因此如果服务器有许多用户,则每个用户使用的资源都与其他用户相同。

如果您的 Web 服务器采用 Apache + mod_php 以外的其他方式配置(例如 Apache + suPHP 或 Apache + fastCGI 或 Apache + mpm 引擎),则计算进程数完全是另一回事。然后脚本以脚本所有者的身份运行,分离资源会更简单。但原理是一样的:除非调用某些外部程序,否则每个脚本都是一个进程。

答案2

是的,通常从启动脚本到结束,至少有一个进程在运行。但脚本可以生成更多进程或线程。

但是,虽然我没有深入研究过这个问题,但我想说的是,如果您因为用户请求而从 Web 服务器启动脚本,那么该脚本可能会作为 Web 服务器进程的一个线程生成,或者作为 Web 服务器进程的一部分运行。因此,要提供准确的信息,您需要知道您正在运行的到底是什么。

更新:从您的评论来看,寻找一个解决方案可能会有所帮助,即运行一个进程,然后为每个请求生成线程。这可以大大提高速度,但需要付出代价(例如,线程只能在父进程运行时运行)。

您可能还想研究连接排队问题。简而言之,您的脚本可以处理多个连接,并检查每个处理程序是否已响应远程服务器,如果没有,则转到下一个处理程序,等等。这在处理 tcp 连接时非常典型,您只需要一个进程,不需要线程。

无论如何,实际程序解决方案的讨论超出了服务器管理的范围,而进入了编程领域。

相关内容