我是 PHP 新手,所以开始我决定实现一个单例。
虽然我能够在 php 中重新创建单例模式,但我不确定如何实现双重检查锁定。
这在 PHP 中是否可能/需要。我在某处读到 PHP 不是多线程的?有人可以确认吗?
如果它是多线程的,有人可以向我解释一下 lock() 或 synchronize() 如何在 PHP 中工作吗?
谢谢,亨利
我是 PHP 新手,所以开始我决定实现一个单例。
虽然我能够在 php 中重新创建单例模式,但我不确定如何实现双重检查锁定。
这在 PHP 中是否可能/需要。我在某处读到 PHP 不是多线程的?有人可以确认吗?
如果它是多线程的,有人可以向我解释一下 lock() 或 synchronize() 如何在 PHP 中工作吗?
谢谢,亨利
PHP 有一个无共享架构:
- 和 HTTP 一样,每个请求都是不同的
- 共享数据下推到数据存储层
- 避免使用前端控制器
这给了我们:
- 负载均衡能力
- 从一个数据中心到另一个数据中心的隐形故障转移
- 更好的应用程序模块化
- 更易于开发和调试
但我不确定如何实现双重检查锁定。
一般来说,数据库层对此负责。MySQL(innodb)标准具有例如行级锁定(这应该足够了)。
InnoDB 在行级别上进行锁定,默认情况下以非锁定一致性读取的形式运行查询,采用 Oracle 的风格。
如果这还不够,那么 SQL 也有例如事务来实现这一点。
联机丛书将事务定义为“作为单个逻辑工作单元执行的操作序列”
就像幻灯片一样,PHP 有一个 Share-nothing-Architecture(traditional) ,这也意味着 PHP 没有thread(model)。虽然您可以编译(默认情况下未启用)PHP 以支持可以相互通信的fork进程。当您还编译信号量函数时,您可以执行sem_acquire和sem_release 之类的操作。但总的来说,这不适用于 PHP。