我在想,使用PHP和MySQL存储用户上传的图像(如头像等)的最佳方式是什么? 我应该从哪里开始? 是否有一篇好的文章介绍这个问题?
出于以下几个原因,图像应该存储在文件系统中:
代理和 If-Modified-Since 网络请求: Apache 可以为您处理 If-Modified-Since HTTP 头,并返回 304 响应,这是最佳性能。反向 Squid 代理和 ISP 发布的代理将尝试利用此功能。
病毒扫描: 如果允许上传任何文件,混蛋们会尝试上传可怕的东西,看看能否破坏您的网站。运行 ClamAV 或类似软件来查看用户上传是否有问题并不过分。如果想要扫描记录中的恶意软件,你不希望绑定数据库。
模式简单性: 如果允许文件上传,还需要添加有关 MIME 类型、文件大小、高度和宽度的元数据。如果文件本身与表中的 MIME 类型不匹配,则需要从表中进行选择并将其流式传输到 /usr/bin/file
。使用 shell_exec( "/usr/bin/file /path/to/mumble" )
可以更简单。
缩略图: 用户图像上传很可能需要生成缩略图,这通常比实际网络请求更容易完成。当一些好心的用户尝试上传他们的专业摄影师朋友给他们的 150MB Photoshop 文件时,如果 Apache 实例在尝试将 ImageMagick 库加载到 web 工作进程的内存空间中时出现 OOM,则真的很不好玩。这对于 Apache 工作者来说真的不可扩展。创建一个工作队列/定期任务以处理此工作。
表损坏: 真是太糟糕了,如果您的 MySQL 索引文件出现故障并且您需要对该表进行离线表修复,则不会瘫痪所有用户头像。
备份和恢复: 不建议使用mysqldump锁定大表。使用rsync将节省时间并提供更大的灵活性。通常情况下,表格是整个恢复的——表格不会以较小的块进行备份。
<img src="<path>/users_images/<user_id>/thumb.gif" />