我们有一些大型文件(1-8GB)无法公开访问。目前,我们通过一个 PHP 脚本来提供这些文件,该脚本以 1MB 的块为单位缓冲文件并将其写入输出。这非常耗费 CPU,并且在只有少数下载处于活动状态时会降低服务器速度。我们希望将文件传输工作转移到 Apache 或更高效的方法。我们正在使用 cookie 身份验证。除非有某种方法可以通过现有的 PHP 会话 cookie 来验证 FTP 会话,否则 FTP 下载将无法进行。
理想情况下,我们希望能够使用 PHP 隐藏文件链接,同时将文件传输工作转交给 Apache,毫无疑问,Apache 在 HTTP 文件传输方面比 PHP 效率高得多。我们还希望能够恢复下载。
任何帮助都将受到赞赏。
答案1
X-Sendfile 是专门为此类操作而设计的。您可以在以下网址阅读有关它的信息http://codeutopia.net/blog/2009/03/06/sending-files-better-apache-mod_xsendfile-and-php/
答案2
mod_auth_tkt 看起来很有趣。如果您的 Apache/PHP 设置托管在 UNIX 上,这里有一个低技术解决方案:
将下载的内容保存在非 Web 可访问的目录中,然后使用 PHP 脚本创建指向该目录的唯一符号链接。然后,您可以在指定时间段后(例如 24 小时后)删除符号链接。
以下是示例。假设您的文件存储在 /private 中并受 .htaccess 文件保护。您还有一个 /public 目录,Apache 在其下运行的用户可对其进行写入。
伪代码:
- 用户进入下载页面
- PHP 脚本生成一个唯一的下载 ID,用作符号链接文件名(例如:79467404-7585-11df-9ead-0022190d59d2)
- PHP 脚本创建从 /public/79467404-7585-11df-9ead-0022190d59d2 到 /private/file1 的符号链接
- PHP 脚本将用户重定向到http://example.com/public/79467404-7585-11df-9ead-0022190d59d2允许文件下载
然后,您可以使用 cronjob 运行“find /public -type l -mtime +24 -exec rm {} \;”或类似命令来删除过期的符号链接。(注意:使用 find 删除文件时要非常小心。)
此解决方案不会阻止某人在接下来的 24 小时内共享链接,因此在重要情况下可能不适用。但它不需要任何额外的 Apache 模块等。
答案3
这个 Serverfault 问题可能相关。或者,你可以使用类似mod_auth_tkt。
答案4
我使用过一种名为 Net 2 FTP 的服务,它是一种纯 html/PHP 界面,用于在线访问 FTP 帐户。您可以相对轻松地下载和安装该软件,而且由于网站很小,因此没有任何开销。
该软件非常有用且易于使用,听起来非常适合您的使用。
主页是http://www.net2ftp.com/,它是完全免费的。