gpt4 book ai didi

php - PHP 核心如何处理客户端连接?

转载 作者:可可西里 更新时间:2023-11-01 12:31:20 25 4
gpt4 key购买 nike

据我所知,对于每个连接到服务器的客户端,PHP 都会为其生成一个新线程。但我想知道这是真的还是假的,如果是真的,这个帖子还能活多久?该线程是否正确维护所有静态变量? (如数据库连接)

当这个线程被销毁时,是否调用了所有的析构函数?

最佳答案

这完全取决于服务器如何设置 PHP。我更熟悉 Apache/PHP 组合(而不是说 Nginx 和 FastCGI 与 PHP 设置),所以关注这个领域:

  1. PHP 通常作为 DSO(动态共享对象)模块集成到 Apache 中。

  2. 现在 Apache 通常在 Linux/Unix 下通常被设置为“预 fork ”模型——即当它启动时,一堆子进程被 fork (确切的数量可以通过 Apache 指令配置),并且它们处于准备处理请求的“进程池”中。

  3. 当请求到达时,内核调度程序从池中选择一个 Apache 进程(如果可用),请求由子进程处理。

  4. 基于 Apache 设置,如果它检测到需要执行 PHP 脚本,它将按照 (1) 中的设置将其交给 PHP DSO。

  5. 因此,在每个请求的基础上不涉及 fork 或线程,这是高效的。所有请求上下文都被传递到开始编译和执行 PHP 脚本的 PHP 层。

    注意:如果启用了操作码缓存,则可以绕过编译步骤 - 即编译 PHP 脚本上的第一个请求,并缓存其关联的操作码以供后续请求重用(这是一个全局所有子进程共享的缓存)。由于编译步骤很昂贵(解析脚本等...),对于生产系统,最好启用操作码缓存。

  6. 当 PHP 脚本完成时,它会进入清理例程(内置于 PHP DSO),它将清理每个请求的内存,关闭所有文件描述,包括数据库句柄(基于如何它被打开)。一些 PHP 方法具有“持久”句柄(例如打开数据库连接、文件句柄),可以跨请求保存,因此您使用哪个函数打开特定资源很重要(其各自的文档突出显示)。默认情况下,大多数资源仅在 PHP 请求的生命周期内保留,并在 PHP 请求完成后销毁。

    关于PHP对象dtors,这完全取决于创建对象的范围。所以对于全局对象,它的 dtors 只会在请求周期结束时被调用,而其中一些会在函数返回时超出范围时被调用。

    因此你得到内存/资源免费管理。您可以通过立即触发释放来通过 unset() 调用来控制它。同样从 PHP 5.3 开始,垃圾收集也可以在请求处理阶段启用 - 请在此处查看更多详细信息:http://www.php.net/manual/en/features.gc.php

  7. 现在,这个 Apache 子进程(运行 PHP 脚本)已返回到进程池中,准备好处理第 3 步中的下一个请求。

我上面描述的是 Linux/Unix 环境中 Apache/PHP 的典型情况,但我认为类似的情况也适用于 Microsoft 设置。

对于 nginx 和 FastCGI+PHP,我认为同样的循环也适用——即,在 PHP+FastCGI 模块处理的请求周期结束时清理事物。同样,当 nginx 启动时,它会启动一个由 FastCGI+PHP 模块处理的独立进程池,并且 nginx 和 FastCGI+PHP 之间的通信发生在 unix 套接字中。

希望这对您有所帮助。

关于php - PHP 核心如何处理客户端连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23501476/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com