我很难获得一些非常基本的PHP问题的答案。我观看的视频教程都是用于使用 PHP的服务器端脚本的基础知识,但实际上很少解释PHP如何工作。
假设我们有2个用户同时连接到来自世界不同地区的同一个LAMP服务器,并且都在请求Widget.php。
(a)Apache / PHP如何有效地“复制”Widget.php脚本的两个实例&它的依赖关系,以便单独处理2个HTTP请求?
(b)根据上面的(a)部分,PHP如何划分用户请求以使它们分开?如果Widget.php使用名为$_SESSION['cheese']
的会话变量,那么PHP如何将2个用户的奶酪价值分开?
(c)PHP $GLOBALS
是用户范围还是应用程序范围?这意味着,对于全局变量$GLOBALS['bread']
,用户1和2是否共享相同的引用,或者PHP是否将它们与上面(b)中的会话变量分开?
(d)PHP $GLOBALS
变量与实现单例设计的对象有什么区别?如果应用程序只能访问单例的1个实例,那么它不是全局的吗?是否应考虑性能因素?
答案 0 :(得分:3)
将php应用程序视为每次服务器请求时执行的脚本,而不是服务器内存中存在的应用程序。当HTTP请求进入时脚本运行,因此$ _SESSION ['cheese']对于请求它的用户是唯一的,因为会话ID存储在客户端浏览器cookie中。
Globals只是具有脚本范围范围的变量,因此对于发送HTTP请求脚本范围的用户来说,它们是相同的。单例是一个只能有一个实例并且与全局不同的类。
PHP脚本是无状态的,因为当脚本完成执行时,对象保持的所有值都将丢失。使对象在执行之间保持持久的唯一方法是串行化到数据库或会话或文件系统。
答案 1 :(得分:1)
(a)PHP像大多数其他CGI实现一样运行。当Web服务器收到对恰好是.cgi / .php脚本的特定URL的请求时,将使用引用的脚本调用解释器。 PHP解释器运行它,并将输出发送回Web服务器/客户端。完成后,该CGI解释器终止并使用它获取所有运行时数据。
这解释了为什么变量不会持久存在或在两个不同的PHP脚本或调用之间共享。它对于普通的mod_php处理程序也是一样的。只有它的简单过程分叉(复制)和终止。
(b)$ _SESSION数组由PHP处理。它可以使用唯一的cookie密钥识别每用户存储。由于每个CGI或mod_php进程都有一个单独的变量池,因此确实没有问题。 PHP只需要一些文件锁定,以防止两个脚本在同一个用户同时请求两个脚本时覆盖会话存储。
(c)“全局”变量也仅存在于每个过程中。当PHP脚本完成时,它们就像其他一切一样消失了。
(d)这是两个不同的概念。我看到你对用法的相似之处是什么意思。但全局变量只是一个共享范围,可能更接近于价值对象。您可以使用全局标识符访问它们,但这是相似之处。
答案 2 :(得分:0)
对于B,用户持有一个名为UUID的唯一ID,它存储在cookie中。所以服务器可以通过读取这个唯一的ID来区分用户并返回适当的会话值。
$ GLOBALS是应用程序范围。
Singleton对象在某种程度上是全局的,但你不一定有一个实例,在具体时刻存在......
答案 3 :(得分:0)
a)你问的是apache / php是如何工作的? = P这是雄心勃勃的...长话短说:php会在每个请求上编译Widget.php,而apache会在Http协议上发送响应
b)你的服务器会将SESSION数据保存在数据库或文件或神奇的地方(不知道它在哪里以及如何做,所有我关心的是它被保存)。在每个请求中,浏览器将发送一个会话cookie,其中包含PHP将用于将适当的信息加载到$ _SESSION变量中的会话ID。 (就像数据库表上的主键一样)c)它是用户范围(脚本端),但不会像会话这样在页面之间保留。
d)$ GLOBALS是一个变量,单例是一个具有属性,方法,访问器,可以继承,覆盖等的对象
祝你好运!