关于PHP中线程安全与非线程安全的解释
开篇之前可能需要先了解下线程、进程、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系统是采用多线程的工作方式,所以:
- IIS时必须选择线程安全的PHP。
- Nginx则配合非线程安全的PHP。
- Apache的LoadModule模式使用线程安全的PHP(大多数使用者的选择)。
- Apache的FastCGI模式使用非线程安全的PHP。