首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP、$GLOBALS & Singletons

PHP、$GLOBALS & Singletons
EN

Stack Overflow用户
提问于 2011-04-18 14:18:05
回答 4查看 2K关注 0票数 4

我很难找到一些非常基本的PHP问题的答案。我看过的视频教程都是关于使用PHP编写服务器端脚本的基础知识,但实际上很少有人解释PHP是如何在幕后工作的。

假设我们有两个用户同时连接到来自世界不同地区的同一台LAMP服务器,并且都在请求Widget.php。

(a) Apache/PHP如何有效地“复制”Widget.php脚本的2个实例及其依赖关系,以便单独处理2个HTTP请求?

(b)源自上文(a)部分,PHP如何将用户请求划分为单独的请求?如果Widget.php使用一个名为$_SESSION['cheese']的会话变量,那么对于这两个用户来说,PHP如何将奶酪的值分开呢?

(c) PHP $GLOBALS是用户范围的还是应用程序的?这意味着,对于全局变量$GLOBALS['bread'],用户1和2是否共享对它的相同引用,还是将它们保持分离,就像(b)中的会话变量一样?

(d) PHP变量与实现单例设计的对象之间有什么区别?如果应用程序只能访问单例的一个实例,那么它不是全局的吗?是否应考虑业绩因素?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-04-18 14:27:44

将php应用程序想象为每次服务器请求时执行的脚本,而不是服务器内存中存在的应用程序。因此,当HTTP请求在脚本中运行时,$_ session‘’cheese‘对于请求它的用户是唯一的,因为会话id存储在浏览器cookie中的客户端。

Globals只是脚本范围很宽的变量,所以对于向wide发送HTTP请求脚本的用户来说是一样的。单例是一个类,它只能有一个实例,并且与全局类不相同。

PHP脚本是无状态的,因为当脚本完成执行时,对象保存的所有值都将丢失。使对象在两次执行之间持久化的唯一方法是序列化到数据库、会话或文件系统。

票数 3
EN

Stack Overflow用户

发布于 2011-04-18 14:32:43

(a) PHP的操作与大多数其他CGI实现一样。当When服务器接收到一个特定URL的请求时,这个URL恰好是一个..cgi/..php脚本,然后使用引用的脚本调用解释器。PHP解释器运行它,并将输出发送回and服务器/客户端。在它完成之后,CGI解释器将终止并带走它的所有运行时数据。

这解释了为什么变量不持久化,或者在两个不同的PHP脚本或调用之间共享。对于普通的mod_php处理程序,它的工作原理也是一样的。只有在那里,它才是简单的过程分叉(复制)和终止。

(b) $_SESSION数组由PHP处理。它可以使用唯一的cookie键识别每个用户的存储。而且,由于每个CGI或mod_php进程都有一个单独的变量池,所以实际上没有问题。当同一个用户同时请求两个脚本时,PHP只需要一点文件锁定就可以防止两个脚本覆盖会话存储。

(c)“全球”变量也只存在于每个过程中。当PHP脚本完成时,它们就像其他东西一样消失了。

(d)这是两个不同的概念。我明白你的意思了。但是全局只是一个共享的作用域,作为值对象可能受到更严格的限制。您可以使用全局标识符来访问这两种标识符,但这就是它们的相似之处。

票数 1
EN

Stack Overflow用户

发布于 2011-04-18 14:39:00

你在问apache/php是如何工作的?长话短说: php将根据每个请求编译Widget.php,apache将在Http协议上发送响应。

( b)您的服务器会将会话数据保存在数据库、文件或神奇的位置(不知道它在哪里和如何实现,我只关心它是否保存了)。对于每个请求,浏览器将发送一个会话cookie,其中包含PHP将用于将适当信息加载到$_SESSION变量中的会话id。(就像数据库表上的主键)

c)它是用户范围的(脚本端),但是它不会保存在像会话这样的页面之间。

( d) $GLOBALS是一个变量,单例是具有属性、方法、访问器、可以继承、覆盖等的对象。

祝好运!

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

https://stackoverflow.com/questions/5704227

复制
相关文章

相似问题

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