我刚刚浏览了moodle CMS中使用的一些* .php文件。 Moodle使用PHP-Scripts生成动态发送给访问者的HTML页面内容。通常会发生类似这样的事情("包含级联"):
// file: file1.php
require(file2.php);
和
// file: file2.php require(file3.php); require(file4.php);
等...
实际上,从请求的* .php文件开始,直到最终生成一些输出,其他文件必须包含大量内容。即使这很有意义,它也会让我担心它对速度/性能的影响。似乎每次很多初始化都是重做。
知道HTTP协议是无状态协议,在我看来,对于发送到服务器的每个请求,必须一遍又一遍地运行在PHP / CGI代码中完成的所有可能的初始化。这是一个有效/真实的假设吗?
示例:我需要访问数据库,我想安全地使用一些有助于完成所有这些操作的对象"更安全"因此,在我包含的文件(即myDatabaseAccessObject.php
)中创建用于此的对象。
关于这个例子,问题是:
是否真的,由于HTTP的性质是无状态的,没有机会继续设置(即解析)myDatabaseAccessObject.php
在每次请求时重复完成的工作?
或者PHP是否可以缓存已经完成的工作? (如果是这样,是以透明的方式完成的(即脚本作者可以告诉缓存什么)或模糊的方式,php-engine会做一些不可见的缓存作者吗?)
我是否对所发生的事情有一种绝对错误的认识,或者确实是一次又一次地完成工作,如果在多个后续请求之间保存了PHP脚本所需的一些初始化,那么这可以保存吗?
答案 0 :(得分:1)
你完全正确。其他初始化的所有数据库连接都在每个PHP脚本执行时完成。这正是因为HTTP协议的无状态。
话虽如此,有办法加快这个过程。有PHP session handling可以为你做的事情(尽管它不能缓存连接),Smarty例如有一个像样的缓存和编译系统等。
答案 1 :(得分:1)
好吧,开始吧:HTTP不再 无状态。 HTTP 1.1添加了持久连接,这本身并不会使其成为有状态,但不会使协议完全无状态。如果HTTP 1.1真的是无状态的,并且你会使用持久连接(分块传输),你会诅咒协议太慢,所以他们以某种方式解决了这个问题,这就是我听到的原因HTTP 1.1被称为脏无状态。这就是我的目标。
所以,回到你的问题:是的,PHP / CGI的标准安装(确定你没有使用fCGI?)必须解析,编译和执行每个请求的所有代码。这不是什么大不了的事,但它仍然是开销
你不能在两个请求之间保持状态,而不是真的。如果你想到它,这就是为什么许多人认为static
关键字在PHP中毫无意义,但这是另一回事。
您的问题主要关注数据库连接。好吧,你可以使用持久数据库连接,PHP可能会从连接池中提取下一个连接。但那是危险的,凌乱的,只是一场等待发生的事故 连接到数据库不太可能是您的主要瓶颈。既然你正在使用moodle,我会说这将是过多的I / O操作(你说的需要级联)。
通过缓存PHP在编译脚本时生成的实际字节码,可以很容易地避免这种情况。 Look into APC,AFAIK,它是最受欢迎的缓存扩展程序。它使您可以控制缓存的内容,方式和时间......
如果你喜欢生活在边缘,并且你没有处理任何关键的事情,你甚至可以检查你获得多少性能提升if you compile your code to an executable