我需要一些帮助来理解PHP的内部工作原理。
还记得吗,在过去,我们常常编写TSR (Terminate and stay resident)例程(前windows时代)?一旦该程序被执行,它将留在内存中,并可以通过某个热键(alt-或ctrl-键组合)重新执行。
我想在web服务器/应用程序中使用类似的概念。比方说,我有一个common_functions.php,它由运行在apache/php服务器上的所有web应用程序的通用函数(如Generate_City_Combo()、Check_Permission()或Generate_User_Permission_list()等)组成。
在所有模块或应用程序的php文件中,我可以这样写:
require_once(common_functions.php);
它将在所有模块和应用程序中包含该公共文件,并且运行良好。
我的问题是: php是如何在内部处理这个问题的?
假设我有:两个应用程序AppOne和AppTwo。
AppOne有两个菜单选项AppOne_Menu_PQR和AppOne_Menu_XYZ
AppTwo有两个菜单选项AppTwo_Menu_ABC和APPTwo_Menu_DEF
这四个菜单项都调用common_functions.php中的函数{如Generate_City_Combo()、Check_Permission()或Generate_User_Permission_list()
现在考虑以下场景: A)用户XXX登录并从他的个性化仪表板点击AppOne_Menu_PQR,然后他/他跟随所有的屏幕和说明。这是一系列8-10个页面请求(屏幕),它是交互式的。在此之后,用户XXX从他的个性化仪表板单击AppTwo_Menu_DEF,然后再次像前面一样浏览所有屏幕和说明(大约8-10页/屏幕)。然后用户XXX注销。
B)用户XXX登录并执行场景A中提到的任何操作。同时,用户YYY也登录(从其他客户端计算机)并执行场景A中提到的类似操作。
对于场景A,它是相同的会话。对于场景B,有两个不同的会话。
假设所有菜单选项都调用Generate_User_Permission_list()和Generate_Footer(),或者许多菜单选项都调用Generate_City_Combo()。
那么PHP会在每个页面请求中执行/包含common_functions.php多少次呢?每个会话?还是每次PHP启动/关闭?我的理解是,common_functions.php将在每个页面请求/周期/加载/屏幕上执行一次,对吗?基本上,每次交互都需要一次。
请记住,像Generate_City_Combo()或Generate_Footer()这样的函数会产生相同的输出或做相同的事情,而不管是谁在什么时候调用。
我想将此限制为每次应用程序启动和关闭一次。
这些只是一些例子。我的实际问题要复杂得多,牵涉其中。在我的应用程序中,我只想调用Application_Startup()例程一次,这将创建理想的环境(如所有的查找和引用数据结构、只读数据、安全矩阵、菜单选项、上下文敏感的业务执行逻辑等)。在此之后,所有到达服务器的请求不需要花费任何时间和资源来创建环境,而是可以立即引用“已创建的环境”。
这在PHP中是可行的吗?多么?你能给我指出一些解释PHP内部工作原理的地方或书籍吗?
提前谢谢。
发布于 2010-02-27 12:29:46
PHP在一个完全独立的执行框架中处理每个HTTP请求--不存在为所有请求提供服务的持久进程。(您的the服务器正在运行,但每次加载PHP页面时,都会调用PHP解释器的一个单独实例。)
如果生成所需的持久化区域所需的时间很长,您可能希望考虑将这些脚本的输出缓存到磁盘上,如果缓存的版本可用(且未过期),则首先加载缓存的版本。
发布于 2010-02-27 12:32:47
PHP(几乎在所有情况下)都是面向页面的。没有Application_Startup()可以跨HTTP请求维护状态。
有时,您可以通过从数据库或$_SESSION加载/卸载序列化数据来模拟这一点,但这涉及到开销。此外,在其他情况下,memcached服务器也可以优化这一点,但您通常不能将其用于cPanel等典型的虚拟主机服务。
如果我必须构建一个像你所说的那样的应用程序,我会将用户的选择序列化到会话中,然后将需要在会话之间保存的任何内容保存到数据库中。
PHP模块有几个,比如Doctrine,它们简化了到数据库的对象序列化。
发布于 2010-02-27 12:34:13
我想说,你可能过早地进行了优化,但还是有希望的。
您经常希望在内存中有多个已编译代码的副本,因为您希望每个请求都保持稳定;您不希望单独的请求在相同的内存空间中运行,并冒着竞争条件或数据损坏的风险!
也就是说,有PHP Accelerators可以预编译PHP代码,大大加快了包含和请求调用的速度。
https://stackoverflow.com/questions/2346232
复制相似问题