• 674阅读
  • 1回复

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

楼层直达
Windows版的PHP从版本5.2.1开始有Thread Safe(线程安全)和None Thread Safe(NTS,非线程安全)之分,这两者不同在于何处?到底应该用哪种?这里做一个简单的介绍。 N>Y3[G+  
FG\?_G  
从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环境,其消耗是巨大的。 h+@t8Q;gGw  
HfPeR8I%i  
为了兼顾IIS下PHP的效率和安全,微软给出了FastCGI的解 决方案。FastCGI可以让PHP的进程重复利用而不是每一个新的请求就重开一个进程。同时FastCGI也可以允许几个进程同时执行。这样既解决了 CGI进程模式消耗太大的问题,又利用上了CGI进程模式不存在线程安全问题的优势。 n0q(EQy1U  
CuNHDYQ&3  
因此,如果是使用ISAPI的方式来运行PHP就必须用Thread Safe(线程安全)的版本;而用FastCGI模式运行PHP的话就没有必要用线程安全检查了,用None Thread Safe(NTS,非线程安全)的版本能够更好的提高效率。
只看该作者 安逸沙发  发表于: 2017-03-26
对于PHP输出的内容,如果不是需要经常变动的内容(例如伪静态的一些页面,PHP输出JS或者CSS),使用PHP合理设置HTTP响应头添加缓存设置,让浏览器尽可能缓存下内容,在刷新和再次访问同样内容时,便不需要再次请求浏览器,从而能够大幅减少服务器的响应次数,同时浏览器呈现页面也会加快了,这是非常有用的一个技巧。 B~b ='jN  
'T7Y5X80$j  
1、输出Cache-Control头: QZ[S, c^  
header('Cache-Control:max-age=120'); tKds|0,j|  
4vNH"72P  
这个的输出是表明让浏览器缓存120秒。这个指令很有用,但是局限性在于,刷新这个页面时还是会重新请求,所以你会感觉这个头好像没什么作用,但是对于一些输出的JS、CSS内容时是有用的,也就是说你刷新的页面不是它本身,而只是引用了设置有此头的PHP文件的话,它就会在你指定的时间内从本地缓存中读取内容而不会请求服务器。同时通过超链接过来的已经请求过的页面时,你也会看到浏览器从本地cache里读取而不用通过服务器。 4J?\JcGs  
?y__ Vrw  
2、更高级玩法:通过设置Last-Modified、Expires头设定缓存 [.w`r>kZI  
如下面这段代码 s#8T46?  
irP*:QM  
d[nz0LI|mk  
<?php Wtp=1  
$interval=120; //2分钟 [k&7h,  
if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){ B\qy:nr j  
    // HTTP_IF_MODIFIED_SINCE即下面的: Last-Modified,文档缓存时间. `cIeqp  
    // 缓存时间+时长. RD;A  
    $c_time = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])+$interval; zMM ~4?4  
    // 当大于当前时间时, 表示还在缓存中... 释放304 \ Co Z+  
    if($c_time > time()){ LabI5+g  
        header('HTTP/1.1 304 Not Modified'); y,@yaM}-/K  
        exit(); ?6L8#"=  
    } b! teSf  
} 7]i6 Gk  
header('Cache-Control:max-age='.$interval); "L8Hgwg  
header("Expires: " . gmdate("D, d M Y H:i:s",time()+$interval)." GMT"); N P5K1:  
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); } :gi<#-:G  
echo ' - <a href="">点击重新载入本页面</a><br />'; %?F$3YN,  
Zv?"1Y< L  
当浏览器首次访问时,请求头不会带HTTP_IF_MODIFIED_SINCE这个东西,所以我们就设置了三个头。 m9 ]Ge]  
一个就是刚才第1点,Cache-Control头,告诉让浏览器自己缓存个120秒。 IGab~`c-[  
第二个头Expires是表明,在当前时间的120秒后缓存失效,浏览器会在120秒后把缓存失效,再次请求时会到服务器端请求而不是本地。 MmFtG-  
第三个头Last-Modified则是说明这个文档最后修改时间。可以看出输出的当前时间。 _'^_9u G  
]86*k %A  
当浏览器再次访问时(刷新页面),浏览器因为在第一次时接收到了Last-Modified,它便会根据这个时间去检查服务器的文档是否更新过,也就是会把这个时间用HTTP_IF_MODIFIED_SINCE这个东西带过去,于是也就有了第一个花括号内容的判断。而花括号内再次根据这个时间加上你设置的时间(120秒),看看是不是超出了当前的时间time(),如果超出了,那就是还在缓存期内,帮直接返回304,然后直接退出。这时候浏览器便会自动用缓存的内容。这样子做,服务器返回的内容就很短,只是一个304响应头而已,而内容不需要返回,这可大大节省网络流量,显然浏览器的响应速度也会感觉明显快了。 '+'h^  
\((5Sd  
按F5刷新或者按浏览器的刷新按钮时,你将发现2分钟内你的PHP请求将是304状态返回。 yf-2E_yB  
强制刷新(CTRL+F5)时,浏览器不会带HTTP_IF_MODIFIED_SINCE这个东西去判断,所以同正常浏览一样,返回200状态。这个逻辑是正常的,因为强制刷新本就相当于完全请求一遍最新内容。 P :%b[7  
"D KrQ,L  
快乐无极 提醒:浏览器头中的缓存设置虽然技巧虽小,但是在web应用中非常有用。合理利用浏览器的缓存,尽量避免重复内容的请求,一个页面少了几十KB的请求,流量大的网站一天能够节省几百M甚至几G的网络流量。这对提升用户体验来说也是一个相当重要的设置项。
快速回复

限100 字节
安逸网提示:如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
认证码:
上一个 下一个