首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP架构:我该怎么做?

PHP架构:我该怎么做?
EN

Stack Overflow用户
提问于 2010-02-27 12:24:31
回答 4查看 515关注 0票数 4

我需要一些帮助来理解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内部工作原理的地方或书籍吗?

提前谢谢。

EN

回答 4

Stack Overflow用户

发布于 2010-02-27 12:29:46

PHP在一个完全独立的执行框架中处理每个HTTP请求--不存在为所有请求提供服务的持久进程。(您的the服务器正在运行,但每次加载PHP页面时,都会调用PHP解释器的一个单独实例。)

如果生成所需的持久化区域所需的时间很长,您可能希望考虑将这些脚本的输出缓存到磁盘上,如果缓存的版本可用(且未过期),则首先加载缓存的版本。

票数 2
EN

Stack Overflow用户

发布于 2010-02-27 12:32:47

PHP(几乎在所有情况下)都是面向页面的。没有Application_Startup()可以跨HTTP请求维护状态。

有时,您可以通过从数据库或$_SESSION加载/卸载序列化数据来模拟这一点,但这涉及到开销。此外,在其他情况下,memcached服务器也可以优化这一点,但您通常不能将其用于cPanel等典型的虚拟主机服务。

如果我必须构建一个像你所说的那样的应用程序,我会将用户的选择序列化到会话中,然后将需要在会话之间保存的任何内容保存到数据库中。

PHP模块有几个,比如Doctrine,它们简化了到数据库的对象序列化。

票数 1
EN

Stack Overflow用户

发布于 2010-02-27 12:34:13

我想说,你可能过早地进行了优化,但还是有希望的。

您经常希望在内存中有多个已编译代码的副本,因为您希望每个请求都保持稳定;您不希望单独的请求在相同的内存空间中运行,并冒着竞争条件或数据损坏的风险!

也就是说,有PHP Accelerators可以预编译PHP代码,大大加快了包含和请求调用的速度。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2346232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档