我想知道关于Apache的PHP。从不同用户对服务器进行多次调用 - 可以彼此相邻,在不同的州,不同的国家/地区等... - 共享内存?
例如,如果我在PHP脚本中创建一个静态变量并默认将其设置为1
,那么user1
会进来,它会变为2
,然后几乎在在user2
进入的完全相同的时间内,他是否看到值为1
或2
的静态变量?
更好的例子是我在PHP中使用的这个类:
class ApplicationRegistry {
private static $instance;
private static $PDO;
private function __construct() {
self::$PDO = $db = new \PDO('mysql:unix_socket=/........');
self::$PDO->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
}
static function instance() {
if(!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
static function getDSN() {
if(!isset(self::$PDO)) {
self::instance();
return self::$PDO;
}
return self::$PDO;
}
}
所以这是一个具有静态PDO实例的Singleton。如果user1
和user2
在同一时间点击服务器,他们是使用不同的PDO实例还是使用相同的实例?
这对我来说是一个令人困惑的概念,我正在考虑如何扩展我的应用程序。
答案 0 :(得分:3)
从不同的用户对服务器进行多次调用(可以坐着 彼此相邻,在不同的州,不同的国家等) 分享记忆?
没有。每次Apache调用PHP脚本时,都会运行该脚本的新实例。
例如,如果我在PHP脚本中创建一个静态变量并进行设置 默认为
1
,然后user1
进来,它会更改为2
然后几乎在同一时间user2
进来,他看到了吗? 该静态变量的值为1
或2
?
两位用户都会看到1
,只有2
才会看到2
,如果他们与您的脚本互动的方式会将其更改为{{1}}。所有行动都是独立的。
如果user1和user2在同一时间点击服务器 他们使用不同的PDO实例,还是使用相同的实例?
他们可以在你的思想被吹嘘的同时完美地击中它,但每个服务器请求产生一个新的Apache进程,然后启动一个新的PHP进程,然后运行你的代码。
这对我来说是一个令人困惑的概念,我正在考虑如何扩展我的应用程序。
您正在混合两个不同的概念:可扩展性和加载时的PHP代码状态。这是你不得不担心Ruby&amp ;; Java程序,因为它们通常在服务器上运行时始终运行。
但PHP仅在发出Apache请求时运行。就是这样。可扩展性是您现在不必过于担心的事情。只是代码&创建你喜欢的应用程序。很快你会发现代码运行时出现的阻塞点。
更新:由于您在评论中提到您担心因为您没有使用MySQL的自动增量功能而导致ID冲突,这是一个问题。这可能会让你陷入困境,但如果不查看实际代码就很难说。
本例中您使用MySQL进行的问题与PHP无关,而是您坚持不自动递增id值。这是MySQL&最好重构代码,将id创建的负担放在MySQL服务器本身上。
如果你真的担心这个&由于某种原因,绝对不能为你的MySQL数据库设置自动增量,考虑使用随机生成的MD5哈希或类似的东西而不是id。或者也许与正常的数字ID一起使用。这样两个用户在完全相同的时刻点击服务器的几率&使用随机哈希获得相同的ID非常低。