这里有一些历史记录:最近完成了一个允许我上传图像并将其存储在目录中的应用程序,它还将该文件的信息存储在数据库中。数据库存储位置,名称并为其提供ID(auto_increment)。
好的,我现在正在做的是允许人们在帖子中插入图片。在最好的方法上提出一些想法,因为我设计的应用程序允许人们移动文件,并且如果图像被移动到不同的目录,我不希望帖子中的图像中断(因此存储的ID)。
我正在考虑做的是在链接到图像时,而不是直接链接到文件,我将其链接如下:
<img src="/path/to/functions.php?method=media&id=<IMG_ID_HERE>" alt="" />
所以它需要ID,搜索数据库,然后从那里确定mime类型,什么不是,然后吐出图像。
所以,我的问题是:这是效率最高的方式吗? 请注意,在单个页面上可能有3到30个图像,所有图像都会调用此函数。
答案 0 :(得分:2)
只要您了解PHP和Web服务器配置的内存限制,这样做应该没问题。 (虽然你只是通过先接收文件来解决这些问题)
否则,如果你对这只是图片的严格要求,那么采用Mike B的方法可能会更有效率。设计一个静态区域,然后将图像放在那里,并将这些位置记录在相关帖子的记录中。它的工作量少,而且不用担心...而且我愿意打赌你的网络服务器在提供文件方面要比大多数开发人员的自定义应用程序代码更好。
答案 1 :(得分:1)
通常,我建议保持图像的src静态(而不是php脚本)。但是,如果您允许用户在文件系统中移动它们,则需要一种方法来跟踪它们
某种形式的缓存有助于减少获取每个图像的文件系统位置所需的数据库调用次数。应该很容易在缓存上放置一个不确定的TTL,并在移动的图像上失效。
答案 2 :(得分:1)
我认为你不应该担心,你的计划听起来不错。
但是如果你想尽量减少请求或其他什么,你可以做以下事情:当有人在帖子中嵌入图像时,用一些特殊的字符序列替换锚标记,如{{1} } 或者其他的东西。然后,当查看包含一个或多个帖子的页面时,搜索所有帖子以查找所有[MYIMAGE=1234]
序列,查询数据库以获取所有图像的位置,然后输出{{1用适当的锚标签替换序列。您可能希望也可能不希望确保用户无法直接向其提交的内容添加[MYIMAGE=]
标记。
答案 3 :(得分:0)
你建议的方式会起作用,而且它可以说是最好的解决方案,但是我应该警告你,我之前尝试过类似的东西,它在负载下完全崩溃了。数据库似乎保持不变,但脚本将开始超时并且图像不会到达。这可能取决于某些特定的服务器配置,但值得记住。
根据您对运行的服务器的访问权限,您可以在用户移动文件时创建符号链接。它有点乱,但它会快速可靠,如果用户将文件移动到另一个文件的位置,也会处理冲突。
答案 4 :(得分:0)
使用Hammerite提议的格式,并使用[MYIMAGE=1234]
标签(或类似的东西)。
然后,您可以在显示之前获取id-path映射,并将[MYIMAGE
]标记替换为直接链接到图像的适当标记。这将比使用php输出图像产生更好的性能。
您甚至可以完全绕过数据库,只需使用像(例如)/images/hash(IMAGEID).jpg
这样的图像路径。
(如果有不同的文件格式,请使用[MYIMAGE=1234.png]
,这样您就可以在没有数据库调用的情况下附加png / jpg /)
如果需要更改图像位置,输出方法或其他任何内容,您只需要更改将[MYIMAGE]
标记转换为完整文件路径的方法。