PHP多次调用服务器共享对象?

时间:2014-06-07 03:16:03

标签: php apache pdo static scale

我想知道关于Apache的PHP。从不同用户对服务器进行多次调用 - 可以彼此相邻,在不同的州,不同的国家/地区等... - 共享内存?

例如,如果我在PHP脚本中创建一个静态变量并默认将其设置为1,那么user1会进来,它会变为2,然后几乎在在user2进入的完全相同的时间内,他是否看到值为12的静态变量?

更好的例子是我在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。如果user1user2在同一时间点击服务器,他们是使用不同的PDO实例还是使用相同的实例?

这对我来说是一个令人困惑的概念,我正在考虑如何扩展我的应用程序。

1 个答案:

答案 0 :(得分:3)

  

从不同的用户对服务器进行多次调用(可以坐着   彼此相邻,在不同的州,不同的国家等)   分享记忆?

没有。每次Apache调用PHP脚本时,都会运行该脚本的新实例。

  

例如,如果我在PHP脚本中创建一个静态变量并进行设置   默认为1,然后user1进来,它会更改为2   然后几乎在同一时间user2进来,他看到了吗?   该静态变量的值为12

两位用户都会看到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非常低。