1

我在我的下载脚本中使用 passthru("cat filepath") 。我担心它可能会使用大量服务器资源。

直接链接公共目录中的文件和使用 php 中的 passthru("cat filepath") 下载文件有什么区别?

4

3 回答 3

4

直接链接公共目录中的文件和使用 php 中的 passthru("cat filepath") 下载文件有什么区别?

不同之处在于直接链接到文件不会调用 PHP,而运行 PHP 脚本又会cat导致 PHP 和cat被调用。这将占用适量的额外内存,但在大多数情况下不会导致服务器负载。

我使用的是 readfile(),但是这个函数不能用于大于 2gb 的文件

在这种情况下,您可能希望找到比通过 PHP 传递所有文件内容更好的解决方案。查看您选择的 Web 服务器软件中的X-Sendfile支持。

于 2011-06-24T07:15:03.330 回答
3

不要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;
}
于 2011-06-24T07:08:39.307 回答
2

代替passthru('cat filepath'),使用 PHP native readfile('filepath'),它具有更好的性能。

不过,这两种方法都比直接链接到文件要慢,因为 PHP 有一定的开销。

于 2011-06-24T07:09:34.537 回答