• 672阅读
  • 1回复

PHP的线程安全与非线程(NTS)安全版本的区别

楼层直达
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。 +qpG$#J0  
D=%1?8K  
从2000年10月20日发布的第一 个Windows版的PHP3.0.17开始的都是线程安全的版本,这是由于与Linux/Unix系统是采用多进程的工作方式不同的是Windows系 统是采用多线程的工作方式。如果在IIS下以CGI方式运行PHP会非常慢,这是由于CGI模式是建立在多进程的基础之上的,而非多线程。一般我们会把 PHP配置成以ISAPI的方式来运行,ISAPI是多线程的方式,这样就快多了。但存在一个问题,很多常用的PHP扩展是以Linux/Unix的多进 程思想来开发的,这些扩展在ISAPI的方式运行时就会出错搞垮IIS。因此在IIS下CGI模式才是PHP运行的最安全方式,但CGI模式对于每个 HTTP请求都需要重新加载和卸载整个PHP环境,其消耗是巨大的。 [%yj' )R/  
569p/?  
为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解 决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了 CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。 SAitufS  
S8kzAT  
因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。
只看该作者 安逸沙发  发表于: 2017-03-26
对于PHP输出的内容,如果不是需要经常变动的内容(例如伪静态的一些页面,PHP输出JS或者CSS),使用PHP合理设置HTTP响应头添加缓存设置,让浏览器尽可能缓存下内容,在刷新和再次访问同样内容时,便不需要再次请求浏览器,从而能够大幅减少服务器的响应次数,同时浏览器呈现页面也会加快了,这是非常有用的一个技巧。 5JzvT JMx  
6W i n!4  
1、输出Cache-Control头: 9X*N k~}Y  
header('Cache-Control:max-age=120'); JxVGzb`8  
0Ui.nz j  
这个的输出是表明让浏览器缓存120秒。这个指令很有用,但是局限性在于,刷新这个页面时还是会重新请求,所以你会感觉这个头好像没什么作用,但是对于一些输出的JS、CSS内容时是有用的,也就是说你刷新的页面不是它本身,而只是引用了设置有此头的PHP文件的话,它就会在你指定的时间内从本地缓存中读取内容而不会请求服务器。同时通过超链接过来的已经请求过的页面时,你也会看到浏览器从本地cache里读取而不用通过服务器。 {nmG/dn {  
<6Q^o[L  
2、更高级玩法:通过设置Last-Modified、Expires头设定缓存 @|Pm%K`1  
如下面这段代码 Sz0PZtJ  
L)'G_)Sl  
Wb}-H-O  
<?php N3G9o`k  
$interval=120; //2分钟 7@c!4hmrU  
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){ XCM!8x?K  
    // HTTP_IF_MODIFIED_SINCE即下面的: Last-Modified,文档缓存时间. #cY[c1cNv  
    // 缓存时间+时长. 3bRxV @0.  
    $c_time = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])+$interval; 0+\725DJ  
    // 当大于当前时间时, 表示还在缓存中... 释放304 d@3DsE.{i  
    if($c_time > time()){ i c{I  
        header('HTTP/1.1 304 Not Modified'); Z %pc"  
        exit(); n.+*_c8k  
    } /d&m#%9Up]  
} &4%pPL\f  
header('Cache-Control:max-age='.$interval); Dw i-iA_q  
header("Expires: " . gmdate("D, d M Y H:i:s",time()+$interval)." GMT"); <K)]kf  
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); 6mcb'hy  
echo ' - <a href="">点击重新载入本页面</a><br />'; czRBuo+k+  
Luao?;|U  
当浏览器首次访问时,请求头不会带HTTP_IF_MODIFIED_SINCE这个东西,所以我们就设置了三个头。 Hzz{wY   
一个就是刚才第1点,Cache-Control头,告诉让浏览器自己缓存个120秒。 $:s@nKgnD~  
第二个头Expires是表明,在当前时间的120秒后缓存失效,浏览器会在120秒后把缓存失效,再次请求时会到服务器端请求而不是本地。 aR2N,<Cp5  
第三个头Last-Modified则是说明这个文档最后修改时间。可以看出输出的当前时间。 @!iS`u  
89 d%P J0  
当浏览器再次访问时(刷新页面),浏览器因为在第一次时接收到了Last-Modified,它便会根据这个时间去检查服务器的文档是否更新过,也就是会把这个时间用HTTP_IF_MODIFIED_SINCE这个东西带过去,于是也就有了第一个花括号内容的判断。而花括号内再次根据这个时间加上你设置的时间(120秒),看看是不是超出了当前的时间time(),如果超出了,那就是还在缓存期内,帮直接返回304,然后直接退出。这时候浏览器便会自动用缓存的内容。这样子做,服务器返回的内容就很短,只是一个304响应头而已,而内容不需要返回,这可大大节省网络流量,显然浏览器的响应速度也会感觉明显快了。 8L[+$g`  
t'K+)OK  
按F5刷新或者按浏览器的刷新按钮时,你将发现2分钟内你的PHP请求将是304状态返回。 8*-)[+s9il  
强制刷新(CTRL+F5)时,浏览器不会带HTTP_IF_MODIFIED_SINCE这个东西去判断,所以同正常浏览一样,返回200状态。这个逻辑是正常的,因为强制刷新本就相当于完全请求一遍最新内容。 Q7x[08TI  
7#JnQ| ]  
快乐无极 提醒:浏览器头中的缓存设置虽然技巧虽小,但是在web应用中非常有用。合理利用浏览器的缓存,尽量避免重复内容的请求,一个页面少了几十KB的请求,流量大的网站一天能够节省几百M甚至几G的网络流量。这对提升用户体验来说也是一个相当重要的设置项。
快速回复

限100 字节
安逸网提示:批量上传需要先选择文件,再选择上传
 
认证码:
上一个 下一个