微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

> PHP通常作为DSO(动态共享对象)模块集成到Apache中.
>现在,通常在Linux / Unix下的Apache通常被设置为“预分叉”模型 – 即,当它启动时,一堆子进程被分叉(确切的数字可以通过Apache指令配置),并且它们位于准备好处理请求的“进程池”.
>当请求到达时,内核调度程序从池中选择一个Apache进程(如果可用),并由子进程处理请求.
>基于Apache设置,如果它检测到需要执行PHP脚本,则按照(1)中的设置将其交给PHP DSO.
>因此,在每个请求的基础上不涉及分叉或线程,这是有效的.所有请求上下文都传递给PHP层,PHP层开始编译并执行PHP脚本.注意:如果启用了操作码缓存,则可以绕过编译步骤 – 即,编译PHP脚本上的第一个请求,并缓存其关联的操作码以便为后续请求重用(它是所有子进程共享的全局缓存).由于编译步骤很昂贵(解析脚本等),对于生产系统,最好启用操作码缓存.
>当PHP脚本完成时,它进入清理例程(内置于PHP DSO),它将清理每个请求的内存,关闭所有文件描述,包括db句柄(基于它的打开方式).一些PHP方法具有“持久”句柄(例如,打开数据库连接,文件句柄),这些句柄可以跨请求保存,因此您用于打开特定资源的功能很重要(各自的文档突出显示).认情况下,大多数资源仅在PHP请求的生命周期中保留,并且在PHP请求完成后会被销毁.关于PHP对象dtors,这一切都取决于创建对象的范围.因此对于全局对象,其dtors将仅在请求周期结束时被调用,而其中一些将在函数返回时超出范围时被调用.因此,您可以免费获得内存/资源管理.您可以通过unset()调用立即触发空闲来控制它.同样从PHP 5.3开始,也可以在请求处理阶段启用垃圾收集 – 请在此处查看更多详细信息:http://www.php.net/manual/en/features.gc.php
>现在,这个Apache子程序(运行PHP脚本)重新进入准备好处理下一个请求的进程池,如步骤3所示.

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

同样使用Nginx和FastCGI PHP,我认为同样的循环也适用 – 即在PHP FastCGI模块处理的请求周期结束时清理事物.这也是当Nginx启动时,它将启动由FastCGI PHP模块处理的单独进程池,并且Nginx和FastCGI PHP间的通信发生在unix套接字中.

希望这可以帮助.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐