我很难回答一些非常基本的 PHP 问题。我看过的视频教程都是使用 PHP 的服务器端脚本的基础知识,但很少真正解释 PHP 的工作原理。
假设我们有 2 个用户同时从世界不同地区连接到同一个 LAMP 服务器,并且都在请求 Widget.php。
(a) Apache/PHP 如何有效地“复制 2 个实例”Widget.php 脚本及其依赖项,以便分别处理 2 个 HTTP 请求?
(b) 从上面的 (a) 部分开始,PHP 如何划分用户请求以将它们分开?如果 Widget.php 使用名为 $_SESSION['cheese']
的 session 变量,PHP 如何为两个用户保持 cheese 的值分开?
(c) PHP $GLOBALS
是用户范围的还是应用程序范围的?意思是,对于全局变量 $GLOBALS['bread']
,用户 1 和 2 是否都共享对它的相同引用,或者 PHP 是否像上面在 (b) 中对 session 变量所做的那样将它们分开)?
(d) PHP $GLOBALS
变量和实现单例设计的对象有什么区别?如果应用程序只能访问单例的 1 个实例,那么它不是全局的吗?是否应该考虑性能因素?
最佳答案
将 php 应用程序视为每次服务器请求它时执行的脚本,而不是作为存在于服务器内存中的应用程序。当 HTTP 请求进入脚本时,$_SESSION['cheese'] 对于请求它的用户来说是唯一的,因为 session ID 存储在客户端的浏览器 cookie 中。
全局变量只是具有脚本范围的变量,因此对于发送 HTTP 请求脚本范围的用户来说是相同的。单例是一个只能有一个实例的类,与全局的不同。
PHP 脚本是无状态的,因为当脚本完成执行时,对象持有的所有值都将丢失。使对象在执行之间持久存在的唯一方法是序列化到数据库或 session 或文件系统。
关于PHP 作用域、$GLOBALS 和单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5704227/