Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
apache如何为页面运行PHP_Php_Apache - Fatal编程技术网

apache如何为页面运行PHP

apache如何为页面运行PHP,php,apache,Php,Apache,想象一下,http://server/page.php 客户端同时从浏览器向服务器发送该页面的100个请求 服务器是否同时运行100个独立的php.exe进程 它是否重新解释了page.php100次?对此有很多答案。通常,Apache将为传入请求创建一个进程,因此可能会创建100个进程。然而,创建一个进程需要时间,因此,当一个进程完成并终止时,这100个连接中的一个可能会在几分之一秒后出现(因为完全同时出现100个连接是非常罕见的,除非你是Google) 然而,让我们想象一下,100个进程确实

想象一下,
http://server/page.php

客户端同时从浏览器向服务器发送该页面的100个请求

服务器是否同时运行100个独立的
php.exe进程


它是否重新解释了
page.php
100次?

对此有很多答案。通常,Apache将为传入请求创建一个进程,因此可能会创建100个进程。然而,创建一个进程需要时间,因此,当一个进程完成并终止时,这100个连接中的一个可能会在几分之一秒后出现(因为完全同时出现100个连接是非常罕见的,除非你是Google)

然而,让我们想象一下,100个进程确实需要同时保存在内存中,但在可用的服务器RAM中只有50个进程的空间。在这种情况下,将提供50个连接,50个连接必须等待进程死亡并重新生成。因此,这些请求中的随机一半将被延迟,尽管如果一个进程创建进程死亡序列只需要几分之一秒,它们就不必等待很长时间。这就是为什么在提高服务器容量时,减少页面加载时间与增加更多RAM一样重要的原因——进程越快完成,新进程就越快取代它

顺便提一下,减少加载时间的一种方法是生成大量PHP进程并将它们保存在内存中。这是FastCGI(或兼容的fcgid)的基础。不是为每个请求创建和终止一个进程,而是立即在内存中生成一个进程,并重新用于多个请求。对于PHP,这些通常被配置为在一定数量的页面请求(例如1000)后死亡,因为历史上PHP有相当多的内存泄漏(进程被重用越多,内存泄漏越严重)

您询问是否为每个请求重新解释页面。通常是的,但如果您也运行PHP加速器,那么就不是了——PHP编译的字节码会被缓存和重用。因此,将FastCGI方法与加速器相结合,确实可以实现非常快速的服务器。标准PHP没有加速器,但Zend Cache有加速器。

视情况而定

有不同的设置方式,事情可能变得相当复杂

简短的回答是“或多或少”。大量apache进程将产生,PHP代码将被解析并运行

如果要避免解析开销,请使用操作码缓存。(可选PHP缓存)是一种非常流行的缓存。这有许多值得深入研究的简洁特性,但除了安装它之外,没有任何配置,它将确保每个php页面只解析一次操作码

要更改生成的apache服务的数量,很可能您将使用。这使您可以决定是否希望Apache处理多个用户


一般来说,根据我的经验(小站点,而不是大量流量),安装APC是值得的,因为其他方面的默认设置都不太糟糕。

Apache2有多种不同的工作模式

在“prefork”(最常用的)模式下,Apache将为每个请求创建进程,每个进程将运行自己的php.exe。配置文件将分配最大连接数(
MaxClients
在httpd.conf中),Apache将只创建MaxClients。这是为了防止内存耗尽。更多的请求排队等待上一个请求完成


如果不安装操作码缓存扩展,如APC、XCache、eAccelerator,php.exe将重新解释page.php 100次。

根据服务器配置,答案是高度可变的

让我们先回答问题1:

服务器是否同时运行100个单独的php.exe进程

这取决于PHP的安装方式。如果PHP是通过CGI运行的,那么答案是“是的,每个请求调用一个单独的PHP实例”。如果它是通过Apache模块运行的,那么答案是“否,每个请求都会在Apache可执行文件中启动一个新的PHP线程”

其他web服务器也会有类似的变化。请注意,对于基于Unix/Linux的操作系统,为每个请求运行单独的可执行文件副本并不一定对性能有害;操作系统的核心设计为,在许多情况下,任务最好由多个单独的可执行文件来完成,而不是由一个单一的可执行文件来完成

但是,无论您如何处理,大量同时请求都会耗尽服务器资源,并导致用户超时和出错。这就是为什么PHP程序尽快完成运行非常重要的原因。不要为web消费编写运行缓慢的PHP程序;如果你可能有很多流量,你需要像测试功能一样测试性能。让您的程序快速退出将大大降低同时出现大量请求的可能性,这显然会对您的站点性能产生很大影响

现在请回答第二个问题:

它是否将page.php重新解释了100次

对于一个标准的PHP安装,这里的答案是“是的,它确实会影响性能。”

然而,PHP提供了几种专门为缓解这种情况而设计的缓存解决方案。主要选项是APC和Zend缓存,两者都可以作为标准模块安装。使用这些模块将意味着PHP缓存解释的代码,因此它可以在后续调用中运行得更快


从即将发布的PHP5.5版本开始,Zend缓存将作为标准PHP安装的一部分提供。

您的英语很棒!回答得很好,+1。然而,我认为PHP将包括APC,而不是Zend缓存?@halfer-不,是Zend。他们把它重命名为