虽然这个答案可能不代表“最佳实践”,但它确实工作得很好
我们使用带有 apache 的后端服务器作为某种“文件服务器”——为用户上传到其帐户的私人文件和图像提供服务。下面是它的工作原理:
设置 mod_rewrite 以根据需要处理 URL。例如:
RewriteRule /content/(.*) /ServeContent.php?FileName=$1
脚本 ServeContent.php 将执行以下操作:
1. Validate input
2. Authenticate user based on cookie or session data
3. Make a URL with $_GET['FileName'] and the IP of the backend server
http://192.168.1.30/content/somefile.jpg
4. Set appropriate headers for the file type
header('Content-type: image/jpeg')
5. readfile($URL)
这种方法需要在 PHP 中启用 fopen-wrappers。 readfile
不会将内容存储在内存中,因此这确实不会占用太多内存。主要缺点之一是您将在请求期间(可能很长时间)阻止 apache/php 进程。但实际上,除非您运行的是高流量站点,否则您可能不会遇到问题。
如果你是,很可能有更好的解决方案。但这对于我们在各种应用程序上的大文件非常有效。