最近发现网站负载有点高,主要出在图片服务器那边。之前一直用readfile()验证和加载图片,猜测是它所致。
网上说readfile()如果把输出缓存清空的话不走内存,于是我拿自己电脑进行了一个测试。
我在本地放了一个1G左右的大文件,首先用浏览器直接下载。
注意看电脑里的磁盘这项,Firefox占用很高是因为它在预读,这个因为是客户端可以无视。
重点看服务端,nginx是在向外输出文件,所以磁盘也在走,CPU和内存都比较正常。
接着我用PHP输出同一文件,这次的测试结果,除了Nginx的占用外,还多出了PHP-CGI和System两项读数,磁盘和CPU占用整整是之前的三倍!
这是什么情况呢?咨询几位大神后得知,之前用Nginx直接读取文件,流程是:
文件->Nginx->输出
而用PHP请求文件时,流程是:
文件->CGI(System)->PHP->Nginx->输出
虽然我清空了输出缓存,但读取流程依然要经过各环节的磁盘传递,而这些流程无疑增加了磁盘使用。
更可怕的是,对接环节还产生了额外的校验等环节,大幅增加了CPU的使用。
因此,若不是有特别需要,尽量不要使用PHP进行文件读取。