我在下载脚本中使用passthru(“cat filepath”)。我担心的是它可能会使用大量的服务器资源。
在公共目录中直接链接文件和在php中使用passthru(“cat filepath”)下载文件有什么区别?
答案 0 :(得分:4)
在公共目录中直接链接文件和在php中使用passthru(“cat filepath”)下载文件有什么区别?
不同之处在于,直接链接到文件不会调用PHP,而运行PHP脚本又会运行cat
会导致PHP和cat
被调用。这将占用适量的额外内存,但在大多数情况下不会导致服务器负载。
我使用的是readfile(),但此功能不能用于大于2gb的文件
在这种情况下,您可能希望找到比通过PHP传递所有文件内容更好的解决方案。在您选择的Web服务器软件中查看X-Sendfile支持。
答案 1 :(得分:3)
不要使用passthru()
,你要打开 CLI注入并且性能很糟糕。 readfile()
仅为此而存在。
readfile($filepath);
与直接链接相比,通过PHP时会产生很小的开销,但我们通常会谈到毫秒。但是,在使用206 Partial
时,浏览器将无法请求readfile()
,除非您为其编写代码或使用PEAR::HTTP_Download
之类的内容。
编辑:似乎您使用的是passthru()
,因为显然readfile()
无法正确处理> 2GB文件(我从未遇到readfile()
的问题,事实上,我只是用7.2 GB文件测试它,它工作正常)。在这种情况下,至少要转义参数。
function readfile_ext($filepath) {
if(!file_exists($filepath))
return false;
passthru('cat ' . escapeshellarg($filepath));
return true;
}
答案 2 :(得分:2)
而不是passthru('cat filepath')
,使用具有更好性能的PHP原生readfile('filepath')
。
这两种方法都比简单地直接链接到文件慢,因为PHP有一定的开销。