我在我的下载脚本中使用 passthru("cat filepath") 。我担心它可能会使用大量服务器资源。
直接链接公共目录中的文件和使用 php 中的 passthru("cat filepath") 下载文件有什么区别?
我在我的下载脚本中使用 passthru("cat filepath") 。我担心它可能会使用大量服务器资源。
直接链接公共目录中的文件和使用 php 中的 passthru("cat filepath") 下载文件有什么区别?
直接链接公共目录中的文件和使用 php 中的 passthru("cat filepath") 下载文件有什么区别?
不同之处在于直接链接到文件不会调用 PHP,而运行 PHP 脚本又会cat
导致 PHP 和cat
被调用。这将占用适量的额外内存,但在大多数情况下不会导致服务器负载。
我使用的是 readfile(),但是这个函数不能用于大于 2gb 的文件
在这种情况下,您可能希望找到比通过 PHP 传递所有文件内容更好的解决方案。查看您选择的 Web 服务器软件中的X-Sendfile支持。
不要passthru()
为此使用,您正在向CLI 注入开放,并且性能很糟糕。readfile()
就是为此而存在。
readfile($filepath);
与直接链接相比,通过 PHP 的开销很小,但我们通常谈论的是毫秒。但是,浏览器将无法206 Partial
在使用时请求 a ,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;
}
代替passthru('cat filepath')
,使用 PHP native readfile('filepath')
,它具有更好的性能。
不过,这两种方法都比直接链接到文件要慢,因为 PHP 有一定的开销。