网站首页 文章专栏 php线程安全和非线程安全

php线程安全和非线程安全

编辑时间:2020-10-10 18:20:59 作者:苹果 浏览量:3301


    前言:在官网上找php扩展时,经常遇到Thread Safe(线程安全)的版本和None Thread Safe(NTS,非线程安全)的版本,该如何选择呢?


先了解下概念:

线程安全就是在多线程环境下也不会出现数据不一致,而非线程安全就有可能出现数据不一致的情况。


咋一听,感觉线程安全好像比非线程安全要好,其实,不然:

多线程的特性是共享寄存器和内存,所以很容易出错,这个时候程序就需要花一些额外的精力去处理寄存器中的数据一致性,即保证线程安全。单线程则不用考虑这个问题,使用非线程安全效率更高。



引申:

php是单线程还是多线程呢?

php程序本身是单线程的,也就是程序执行时,所跑的程序是依次执行的,必须前面的处理好,后面的才会执行到。


既然php是单线程,直接用非线程安全就完事了,为啥有线程安全?

因为调用php的方式不同

PHP有2中运行方式:ISAPI(只有windows下)和FastCGI。

    ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理别的用户输入,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;


    而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本



以我比较熟悉的linux+nginx来说,采用的是fast-cgi模式,而fast-cgi是单一线程,不存在多个线程之间可能引发的相互干扰,所以选择非线程安全显然更好。



更快更准确的选择方式:

通过phpinfo(); 查看其中的 Thread Safety 项,这个项目就是查看是否是线程安全,如果是:enabled,一般来说应该是ts版,否则是nts版




    出自:何冰华个人网站

    地址:https://www.hebinghua.com/

    转载请注明出处


来说两句吧
最新评论