PHP架构:我该怎么做?

PHP架构:我该怎么做?,php,architecture,internal,Php,Architecture,Internal,我需要一些帮助来理解PHP的内部工作原理 记住,在过去,我们曾经编写TSR(终止并保持驻留)例程(在windows时代之前)?一旦该程序被执行,它将留在内存中,并且可以通过一些热键(alt键或ctrl键组合)重新执行 我想在web服务器/应用程序中使用类似的概念。比方说,我有common_functions.php,它由运行在apache/php服务器上的所有web应用程序的公共函数(如Generate_City_Combo()、Check_Permission()或Generate_User_

我需要一些帮助来理解PHP的内部工作原理

记住,在过去,我们曾经编写TSR(终止并保持驻留)例程(在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_菜单_PQR,然后按照所有屏幕和说明进行操作。这是一系列8-10页请求(屏幕),并且是交互式的。结束后,用户XXX从其个性化仪表板上单击AppTwo_Menu_DEF,并再次像以前的用户一样,按照所有屏幕和说明(大约8-10页/屏幕)进行操作。然后用户XXX注销

B) 用户XXX登录并执行场景A中提到的任何操作。同时,用户YYY也登录(从其他一些客户端计算机)并执行场景A中提到的类似操作

对于场景A,它是同一个会话。对于场景B,有两个不同的会话

假设所有菜单选项调用Generate\u User\u Permission\u list()和Generate\u Footer()或许多菜单选项调用Generate\u City\u Combo()

那么,每个页面请求PHP将执行/包含多少次common_functions.PHP?每节课?还是每次PHP启动/关闭?我的理解是common_functions.php将在每个页面请求/循环/加载/屏幕上执行一次,对吗?基本上每次交互一次

请记住,像Generate_City_Combo()或Generate_Footer()这样的函数会产生相同的输出或执行相同的操作,而不管调用的是谁或何时

我想将此限制为每次应用程序启动和关闭一次

这些只是例子。我的实际问题要复杂得多。在我的应用程序中,我只想调用一次应用程序_Startup()例程,这将创建理想的环境(如所有查找和引用数据结构、只读数据、安全矩阵、菜单选项、上下文相关的业务执行逻辑等)。之后,所有到达服务器的请求不需要花费任何时间或资源来创建环境,但可以立即引用“已创建的环境”

这在PHP中可行吗?怎么用?你能给我指一些地方或一些书来解释PHP的内部工作吗


提前感谢。

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

如果生成所需持久区所需的时间是很重要的,您可能希望考虑缓存来自磁盘上的脚本的输出,并且如果可用的话,首先加载缓存的版本(而不是过时的)。

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

有时,您可以通过从数据库或$\会话加载/卸载序列化数据来模拟这种情况,但这会带来开销。此外,还有其他一些情况下,服务器也可以对此进行优化,但您通常不能将其与典型的虚拟主机服务(如cPanel)一起使用

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


PHP中有几个ORM模块,它们可以将对象序列化简化为数据库。

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

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


也就是说,有一些PHP可以预编译PHP代码,大大加快了include和require调用的速度

我在这里进行亡灵巫术,但随着PThread的出现,似乎有可能朝着这个实际解决方案的方向进行尝试,而不是说,实际上,“不,你不能用PHP做这件事。”

一个人基本上可以用PHP创建自己的多线程web服务器,只需使用CLI工具、套接字函数和pthread即可。只需侦听端口80,将请求添加到请求队列,然后启动一些工作线程来处理队列

可以根据请求队列长度和操作系统的运行队列长度来管理工作进程的数量。每隔几秒钟,主线程就可以通过一个函数来管理工作池的大小。如果web请求队列长度大于操作系统运行队列长度的某个常数倍,并且工作线程数小于配置的最大值,则可以实例化另一个工作线程。如果web请求