我想知道使用PHP和MySQL存储用户上传图像的最佳方式是什么,如avatar等?我应该从哪里开始?有没有关于此的好文章?
tyl*_*erl 16
"最好"取决于你的目标.
存储用户上传图像的两种主要方式是将二进制内容作为BLOB放入数据库,或者将图像存储到驱动器的某个位置,并在数据库中放入一个条目,指示哪个图像属于哪里.
将图像放在数据库中的优点是不需要在Web服务器上使用任何类型的文件系统权限,并且如果您从多个Web服务器提供站点,则会删除任何类型的同步问题.但是,随着时间的推移,它会使您的数据库变得庞大,如果您没有正确设计表,那么它绝对会破坏您的性能和可伸缩性.
将图像作为文件存储在文件系统上具有额外的优点,使得检索非常快速和有效,因为Web服务器非常擅长提供静态文件.
编辑添加
如果您决定将文件内容存储在数据库中,则绝对不要将其放在需要快速访问的表中.例如,如果您在几乎每个网页浏览中都搜索了"用户"表,那么该表就不是放置文件内容的地方.而是创建一个单独的"图像"或"文件"表,其中包含文件和相关的元信息.
将每行的大量字节放入表中会使该表使用起来非常慢.你不希望看到大量使用的表格中的那种东西.
mem*_*oxy 13
图像应该存储在文件系统中,原因有两个:
代理和If-Modified-自Web请求: Apache可以为您处理If-Modified-Since HTTP标头并返回304响应,这就是您可以获得的最佳性能.在ISP发布的反向Squid代理和代理将尝试利用这一点.
病毒扫描:如果您允许任何文件上传,那么混蛋会尝试上传可怕的内容,看看它们是否会破坏您的网站.想要针对用户上传运行ClamAV等来查看是否存在问题并非没有道理.如果要扫描记录中的恶意软件,则不希望占用数据库.
架构简单性:如果允许文件上载,则还需要添加有关MIME类型,文件大小,高度和宽度的元数据.如果文件本身与表中的MIME类型不匹配,则需要对表中的select进行编码并将其流入/usr/bin/file.它可以简单得多shell_exec( "/usr/bin/file /path/to/mumble" ).
缩略图:用户图像上传可能需要用拇指钉,这通常比实际的Web请求更容易完成.当一些有意义的用户尝试上传由他们的专业摄影师伙伴给他们的150MB photoshop文件时,真的不是很有趣,并且当你尝试在Web工作者的内存空间中加载ImageMagick库时,你的apache实例会转到OOM.对于apache worker来说,这真的无法扩展.在Apache之外创建一个工作队列/ cron作业来处理这项工作.
表损坏:哇,如果您的MySQL索引文件被破坏并且您需要在该表上执行脱机表修复,那么您并不真的想要削弱所有用户头像.
备份和恢复:你真的不想用mysqldump锁定一个大表.使用rsync将为您节省大量时间并为您提供更大的灵活性.表通常会在整个表中恢复一次 - 表通常不会以较小的块备份.
| 归档时间: |
|
| 查看次数: |
9518 次 |
| 最近记录: |