关于PHP中线程安全与非线程安全的解释

作者: 乘风御上者 分类: PHP 发布时间: 2020-05-08 22:58

开篇之前可能需要先了解下线程、进程、CGI、FastCGI等概念

线程安全(Thread Safety简称TS)

在PHP多线程环境中,多个线程共享除函数调用栈之外的其他资源,共享资源包括全局变量、全局静态变量、局部静态变量(局部变量不共享),这就造成了当多个线程同时操作某个变量时,会发生变量冲突问题。
PHP专门为解决此类问题抽象出了一个线程安全资源管理器(Thread Safe Resource Mananger简称TSRM)。实现的原理比较简单,直接对每个线程复制一个共享资源的副本,这样大家互不干扰,就不会出现数据不一致或者数据污染问题。

非线程安全(None Thread Safe简称NTS)

由于PHP开启线程安全,使用TSRM机制分配和使用变量会有额外的性能损耗,所以在不需要多线程的环境中,不需要开启线程安全功能,也就是非线程安全。

不同的环境中如何选择呢?

根据PHP的运行方式来确定使用哪种即可。比如当PHP运行方式是CGI/FastCGI时,都是非线程安全。
由于Linux/Unix系统是采用多进程的工作方式,而Windows系统是采用多线程的工作方式,所以:

  1. IIS时必须选择线程安全的PHP。
  2. Nginx则配合非线程安全的PHP。
  3. Apache的LoadModule模式使用线程安全的PHP(大多数使用者的选择)。
  4. Apache的FastCGI模式使用非线程安全的PHP。

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表回复