每个PHP都需要单独的请求吗?

时间:2014-03-26 01:12:54

标签: php http-request

我正在尝试减少网站上的请求数量(以提高网页速度)。在一个文件中,我有10个单独的php require语句调用10个不同的php文件。

我的问题是,这10个要求的陈述是否被视为10个单独的请求?通过将require语句替换为来自被调用的php文件的实际内容,我可以减少请求的数量吗?

如果有人能够澄清这份表格,我将不胜感激。请注意,我不是一名经验丰富的程序员或网页设计师。谢谢!

2 个答案:

答案 0 :(得分:3)

正如第一条评论所述; 请求仅在响应客户时提供; PHP的任何语言结构都不应被描述为请求。

就像我能做到的那样简单......

执行是一个三阶段过程:

  • 从磁盘加载文件
  • 编译成Zend的中间形式
  • 执行中间表格

缓存通过篡夺通常负责从磁盘加载文件并将其编译为Zend的中间表示的Zend部分来提高性能;这样,如果可能的话,可以绕过执行的加载和编译阶段,从而提高性能。

没有操作码缓存

当发出请求时,例如

GET /index.php HTTP/1.1

以正常方式调用服务请求的Web服务器,然后调用PHP解释器。解释器然后从磁盘加载index.php,将其编译成Zend的中间表示,并开始执行代码。

当脚本包含诸如

之类的语句时
include "my_awesome_code.php";

(相同)解释器从磁盘加载my_awesome_code.php,将其编译成Zend的中间表示并执行它。

使用操作码缓存

当发出请求时,例如

GET /index.php HTTP/1.1

以正常方式调用服务请求的Web服务器,然后调用PHP解释器。缓存不是从磁盘加载index.php,而是从内存中检索代码,在内存中存储的代码非常接近Zend的中间表示形式。准备缓存代码(这意味着从共享内存中复制并最终确定它的形式)以便执行比从磁盘加载并首先编译到该表示要快得多。

当脚本包含诸如

之类的语句时
include "my_awesome_code.php";

再次从缓存中检索代码,再次绕过编译。

如果缓存无法在共享内存中找到index.phpmy_awesome_code.php,它会调用它所篡夺的Zend部分;导致从磁盘正常加载并将这些代码编译成Zend的中间表示。缓存拦截生成的中间代码,并在允许第一次执行之前将其存储在共享内存中。

答案 1 :(得分:0)

与我的评论一样,这取决于PHP的安装方式。

如果您使用PHP作为Mod(mod_php),您的Web服务器只会创建一个PHP进程。所有请求都将在此处理。

但是如果你已经将PHP实现为CGI-Wrapper,那么每个请求都会启动一个PHP实例。

要执行加载时间,请使用Opcode-Caches,如eAcceleratorAPC或其他PHP脚本。其他解决方案是以正确的方式处理请求:缓存静态文件文件,如样式表,Javascripts,图像,..

修改

另一个解决方案是:优化您的PHP脚本。一个好的检查员是New Relic,在这里你可以看到,哪些脚本的执行时间非常长。我创建了一个New Relic的博客帖子及其功能,但它仅限于德语:http://hovida-design.de/php-die-macht-der-performance/