0

问题的一些背景

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

// file: file1.php
require(file2.php);

// 文件:file2.php
需要(file3.php);
需要(file4.php);

ETC...

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

问题

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

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

关于这个例子,问题是:
这是否是真的,由于 HTTP 的性质是无状态的,没有机会myDatabaseAccessObject.php在每次请求时阻止重新完成设置(即解析)的工作?

或者 PHP 是否有办法缓存已经完成的工作?(如果是这样,是以透明的方式完成的(即脚本作者可以告诉缓存什么)或模糊的方式,php引擎做了一些作者不可见的缓存吗?)

是我对正在发生的事情有绝对有缺陷的看法,还是确实一遍又一遍地完成了工作,如果在多个后续请求之间保存了 PHP 脚本所需的一些初始化,则可以保存这些工作?

4

2 回答 2

1

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

话虽如此,有一些方法可以加快这个过程。有PHP 会话处理可以为你做一些事情(虽然它不能缓存连接),例如Smarty有一个不错的缓存和编译系统等。

于 2013-09-02T08:48:32.750 回答
1

好吧,开始吧:HTTP 不再是真正的无状态了。HTTP 1.1 添加了持久连接,它本身并没有使其成为有状态的,但并没有使协议完全无状态。如果 HTTP 1.1 真的是无状态的,并且你会使用持久连接(分块传输),你会诅咒协议太慢,所以他们以某种方式解决了它,这就是我听说的原因HTTP 1.1 被称为脏状态无状态。这就是我要说的。

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

您的问题集中在数据库连接上。好吧,您可以使用持久的数据库连接,PHP 可能会从连接池中提取下一个连接。但这很危险,很混乱,只是一场等待发生的事故。
在您的情况下,连接到数据库不太可能成为主要瓶颈。由于您使用的是 moodle,我会说这将是过多的 I/O操作(您所说的要求级联)。

这可以很容易地通过缓存 PHP 在编译脚本时生成的实际字节码来避免。查看 APC和 AFAIK,它是使用中最流行的缓存扩展。它使您可以控制缓存的内容、方式和时间……
如果您喜欢生活在边缘,并且您没有在处理关键的事情,您甚至可以检查如果您获得了多少性能提升将您的代码编译为可执行文件

于 2013-09-02T08:49:12.383 回答