6

我是 PHP 新手,所以开始我决定实现一个单例。

虽然我能够在 php 中重新创建单例模式,但我不确定如何实现双重检查锁定。

这在 PHP 中是否可能/需要。我在某处读到 PHP 不是多线程的?有人可以确认吗?

如果它是多线程的,有人可以向我解释一下 lock() 或 synchronize() 如何在 PHP 中工作吗?

谢谢,亨利

4

1 回答 1

17

无共享架构

PHP 有一个无共享架构

  • 和 HTTP 一样,每个请求都是不同的
  • 共享数据下推到数据存储层
  • 避免使用前端控制器

这给了我们:

  • 负载均衡能力
  • 从一个数据中心到另一个数据中心的隐形故障转移
  • 更好的应用程序模块化
  • 更易于开发和调试

双重检查锁定

但我不确定如何实现双重检查锁定。

一般来说,数据库层对此负责。MySQL(innodb)标准具有例如行级锁定(这应该足够了)。

InnoDB 在行级别上进行锁定,默认情况下以非锁定一致性读取的形式运行查询,采用 Oracle 的风格。

如果这还不够,那么 SQL 也有例如事务来实现这一点。

联机丛书将事务定义为“作为单个逻辑工作单元执行的操作序列”

分叉进程

就像幻灯片一样,PHP 有一个 Share-nothing-Architecture(traditional) ,这也意味着 PHP 没有thread(model)。虽然您可以编译(默认情况下未启用)PHP 以支持可以相互通信的fork进程。当您还编译信号量函数时,您可以执行sem_acquiresem_release 之类的操作。但总的来说,这不适用于 PHP。

于 2011-01-17T07:55:36.453 回答