由于各种原因,我需要在HTTP请求和磁盘上的文件之间播放中介。我的方法是填充标题然后执行readfile('/ path / to / file.jpg');
现在,一切正常,但它甚至会非常缓慢地返回中等大小的图像。
在发送标题后,有人能为我提供更有效的方式将文件流式传输到客户端吗?
注意:如果重要的话,它是共享托管环境中的Linux盒子
答案 0 :(得分:3)
多个Web服务器允许外部脚本告诉他们这样做。 Apache上的X-Sendfile(使用mod_xsendfile)是一个。
简而言之,您发送的只是标题。特殊X-Sendfile
标头指示Web服务器将命名文件作为响应正文发送。
答案 1 :(得分:0)
您可以从实施条件GET请求支持开始。
发送带有文件的“Last-Modified”标头,并在客户端使用“If-Modified-Since”请求文件时回复“304 Not Modified”,并且您看到该文件尚未被修改。一些明智的新鲜度信息(通过“Cache-Control”/“Expires”标题)也建议首先防止对未更改资源的重复请求。
这样,即使您发现自己无法对实际表现采取任何行动,至少可以改善感知性能。
答案 2 :(得分:0)
这实际上应该相当快。我们用大图像完成了这个没有问题。在输出可能会减慢过程的图像之前,您是否正在执行其他操作,例如计算图像上的某些元数据?
编辑: 您可能需要刷新输出并使用fread。 IE:
$fp = fopen($strFile, "rb");
//start buffered download
while(!feof($fp))
{
print(fread($fp,1024*16));
flush();
ob_flush();
}
fclose($fp);
答案 3 :(得分:-2)