通过PHP分发静态内容的最佳实践是什么?

通过PHP分发静态内容的最佳实践是什么?,php,apache,file-upload,Php,Apache,File Upload,这是一个关于如何处理用户上传和向大量并发用户分发静态内容的最佳实践问题 我有一个图像上传表单(png、jpg、gif)和其他形式的多媒体(mp4、webm)。文件被创建、散列并存储在storage/app/attachments/中,作为其散列,不带扩展名 请求URL/file/md5/filename(例如/file/9d42b752ecd0e3b4542aeca21c7c50a9/dancing_cat.gif)将以该名称分发文件。该路径完全灵活,因此将dancing_cat.gif替换为b

这是一个关于如何处理用户上传和向大量并发用户分发静态内容的最佳实践问题

我有一个图像上传表单(png、jpg、gif)和其他形式的多媒体(mp4、webm)。文件被创建、散列并存储在
storage/app/attachments/
中,作为其散列,不带扩展名

请求URL
/file/md5/filename
(例如
/file/9d42b752ecd0e3b4542aeca21c7c50a9/dancing_cat.gif
)将以该名称分发文件。该路径完全灵活,因此将
dancing_cat.gif
替换为
boring_cat_dancing_.gif
仍将获取相同的文件,但将使用指定的新文件名分发该文件

该系统的目的是在保留上传者拥有的文档的原始名称的同时,阻止重复的文档被上传。上载的同一文件的其他实例也将保留其名称

然而,我的代码是有效的,人们提出了通过PHP分发静态内容的问题。有人告诉我,在我的大型目标平台上,这个系统将工作得很差,并将立即成为瓶颈。我被告知应该使用Apache/nginx/Lighhttpd/which Web服务器中的路由,通过在请求URL到达PHP之前捕获请求URL,尝试直接为静态文件提供服务,但这可能会导致mime类型的问题(即图像无法正确呈现)


我的问题是:实现我正在做的事情的最佳实践是什么?一个大型网站如何在避免“PHP瓶颈”的同时分发用户上传的静态内容。我很早就投入到我的项目中去考虑重写,所以请尽可能地提供信息。您可以尝试使用sha1或任何更短的编码器对当前用户名和文件名加上文件扩展名进行散列,该编码器生成散列,很难生成相同的散列组合,并将生成的散列添加到ur dir中保存的文件名中。比如说

/文件/9d42b752ecd0e3b4542aeca21c7c50a9/gifhse3peo40ed-user_photo.jpg

然后,您可以为每个用户分发散列,例如为特定用户创建特定文件夹以保存其上载内容,这样当用户重新上传任何文件时,代码将知道保存位置,反之亦然


希望有帮助

如果你做了一些愚蠢的事情,比如
$foo=file\u get\u contents(这里是md5\u hash\u),php将成为一个瓶颈;echo$foo
,它将在将整个文件吐出客户端之前将其缓存在php内存中。但是有很多方法可以让php将文件以小块的形式流式传输给用户,例如
readfile()
fread()
循环等等。。。它仍然不如直接为文件提供服务那么高效,但也不会造成交通堵塞。你知道什么是内容交付网络(CDN)吗?你调查过了吗?老实说,这个问题不是真正的编程问题。除非您更改为更特定于代码,否则它应该作为主题外关闭。