了解考虑HTTP(无状态协议)的PHP/CGI性能 这些问题的一些背景

了解考虑HTTP(无状态协议)的PHP/CGI性能 这些问题的一些背景,php,performance,http,stateless,Php,Performance,Http,Stateless,我刚刚浏览了一些应用程序中使用的*.php文件。Moodle使用PHP脚本生成动态发送给访问者的HTML页面内容。通常会发生类似的情况(“包含级联”): 及 // file: file2.php require(file3.php); require(file4.php); //文件:file2.php require(file3.php); require(file4.php); 等等 实际上,从请求的*.php文件开始,直到最终生成一些输出,还需要包含大量其他文件。即使这很有道理,我也会担心

我刚刚浏览了一些应用程序中使用的*.php文件。Moodle使用PHP脚本生成动态发送给访问者的HTML页面内容。通常会发生类似的情况(“包含级联”):

// file: file2.php require(file3.php); require(file4.php); //文件:file2.php require(file3.php); require(file4.php); 等等

实际上,从请求的*.php文件开始,直到最终生成一些输出,还需要包含大量其他文件。即使这很有道理,我也会担心它对速度/性能的影响。似乎每次都要重做很多初始化

问题 知道HTTP协议是一个无状态协议,在我看来,对于发送到服务器的每个请求,都有必要反复运行PHP/CGI代码中完成的所有可能的初始化。这是一个有效/真实的假设吗

示例:我需要访问一个数据库,我想使用一些有助于执行所有这些“更安全”的准备语句/消毒等操作的对象安全地执行此操作。因此,用于此操作的对象在我包含的文件中创建(即
myDatabaseAccessObject.php

关于这个例子,问题是:
由于HTTP的无状态性质,设置(即解析)myDatabaseAccessObject.php的工作不会在每次请求时重复进行,这是否是真的

或者PHP是否有办法缓存已经完成的工作? (如果是这样,则以透明方式(即脚本作者可以告诉缓存内容)或隐藏方式进行,php引擎会执行一些作者不可见的缓存?)


是因为我对正在发生的事情有一个完全错误的认识,还是事实上工作是一次又一次地完成的,如果PHP脚本所需的一些初始化可以在多个后续请求之间保存,那么这些工作就可以保存?

你完全正确。所有数据库连接和其他初始化都在每次PHP脚本执行时完成。这正是因为HTTP协议的无状态性


尽管如此,还是有办法加快这一进程。有一些可以为您做一些事情(尽管它不能缓存连接),例如有一个不错的缓存和编译系统等等。

好吧,首先:HTTP不再是真正的无状态。HTTP 1.1添加了持久连接,这本身并不使其成为有状态的,但不会使协议完全无状态。如果HTTP 1.1真的是无状态的,并且你会使用持久连接(分块传输),你会诅咒协议太慢,所以他们在某种程度上解决了这个问题,这就是为什么我听说HTTP 1.1被称为肮脏的无状态。这就是我想说的

因此,回到您的问题:是的,PHP/CGI的标准安装(确定您没有使用fCGI?)必须解析、编译和执行每个请求的所有代码。这没什么大不了的,但它还是开销。
你不能在两个请求之间保持状态,不是真的。如果你仔细想想,这就是为什么很多人认为PHP中的
static
关键字毫无意义,但那是另一回事

您的问题集中在db连接上。您可以使用持久的DB连接,PHP可以从连接池中提取下一个连接。但那是危险的,混乱的,只是一场等待发生的事故。
在您的案例中,连接到DB不太可能是主要的瓶颈。由于您使用的是moodle,我认为这将是过度的I/O操作(您所说的要求级联)

这可以很容易地通过缓存PHP编译脚本时生成的实际字节码来避免,顺便说一句,它是目前使用的最流行的缓存扩展。它让您可以控制缓存的内容、方式和时间…

如果你喜欢生活在边缘,而你没有在做一些重要的事情,你甚至可以检查一下你会得到多少性能提升

根据我的经验,moodle的性能真的很差。只是为了好玩,试着在zend framework中编写hello world。在很多情况下,每次都会完成很多工作,任何现代硬件都没有问题,但这些都是粗略的概括。@marabutt:
$vim index.php
第1行:
exit('hello world')应用程序的(预调度-)无需引导。举个例子:试着用Javasmarty做同样的事情,因为它是一个模板系统,你不是在建议将它用于db连接,是吗?@EliasVanOotegem不。我的观点是它编译和缓存,因此每个页面请求的处理开销都比较小。数据库连接只是页面请求的一部分。PHP会话处理能为我们做什么?与大多数人一样,我使用它主要是为了跟踪登录用户(即,用户不需要在每一步都反复验证)。我将通读该链接,但仅限于kick(您可能知道):上述处理是否能够避免重新验证大部分代码(即重新验证级联?@humanityANDpeace?@humanityANDpeace在不知道级联初始化过程中会发生什么情况的情况下,您可以考虑保留缓存数据,而无需访问数据库。当然,整个“性能”问题比仅仅使用会话或缓存模板要复杂得多。太好了!,非常感谢您确认这一点。原则上,重新估价等情况并非不可能发生。您还带来了一些关于如何缓存甚至编译的参考(因此可能会更酷)。让我们来看一看。@humanityANDpeace:不过,不要指望编译PHP代码会有奇迹。。。脸谱网尝试将PHP编译成C++,并运行C++
// file: file2.php
require(file3.php);
require(file4.php);