discuz论坛中很多附近要下载,或图片附件要显示,这些附件都会被php-cg直接读给lighttpd,lighttpd会全部接收到内存,并且不会迅速释放,从而导致其内存占用增大,我一个中等访问量的论坛lighttpd占用内存有时会达到1.4G。
x-sendfile可以解决这个问题!!php通过x-sendfile头告诉lighttpd文件的路径,lighttpd通过系统调用sendfile直接发送文件到客户端,这样避免了内存占用!!效果很明显!!
1、修改lighttpd配置:
"host" => "127.0.0.1",
"port" => "3000",
"broken-scriptfilename" => "enable",
"allow-x-send-file" => "enable"
2、修改discuz的attachment.php:
if(!$attach['remote']) {
$thumbfilename = $attachdir.'/'.$attach['attachment'].'.thumb.jpg';
dheader("X-LIGHTTPD-send-file: " . $thumbfilename);
exit;
if(is_readable($thumbfilename)) {
$filesize = filesize($thumbfilename);
$fp = fopen($thumbfilename, 'rb');
@flock($fp, 2);
$attachment = @fread($fp, $filesize);
@fclose($fp);
echo $attachment;
exit;
}
} else {
if(getremotefile($attach['attachment'].'.thumb.jpg')) {
exit;
}
}
if(!$attach['remote']) {
error_reporting(0);
dheader("X-LIGHTTPD-send-file: " . $filename);
exit;
// getlocalfile($filename, $readmod, $range);
} else {
if(!getremotefile($attach['attachment'])) {
showmessage('attachment_nonexistence');
}
}
另外:这只能解决文件发送的内存占用问题,对动态生成的页面,如果页面比较大,仍然存在内存占用的问题,这个问题我另有文章说明。