PHP动态图像调整(即时)

5
目前我们的网站存储了2/3个固定的图像尺寸。这些在上传时生成并通过CDN分发。然而,我们需要实现更灵活的解决方案,因为我们正在开发移动和平板应用程序,需要多种不同的尺寸。我们提出的解决方案是创建一个PHP脚本,可以接受图像标识符(ID /类型/ URL等)和大小限制。然后,脚本可以即时创建图像并缓存它以供下一次使用。
这是可行的解决方案吗?
此外,目前CDN可以保护我们的Web服务器免受重负载。是否有办法在生成图像后将CDN纳入此过程中?我能想到的唯一方法是让脚本返回图像资源的URL,但是客户端需要进行2次HTTP请求。重定向可能更快,但对于速度来说仍然是不好的做法,这是正确的吗?

4
我会列出一份可以生成的有效尺寸列表,否则这样的系统容易受到拒绝服务攻击,攻击者会在每个尺寸迭代中快速请求图像。即使是一个最大尺寸为100x100的单个图像,也有10,000个可能的迭代,每个都可以单独请求和生成而不受任何限制,这将消耗时间、内存和磁盘空间。 - Core Xii
2
为什么不向CDN请求一个被缓存的文件版本,与请求中所需大小匹配,如果没有则创建一个新版本,存储以备将来使用并返回给客户端呢?我的意思是,这对我来说是可行的解决方案,也是最能减轻服务器负担的方法。 - Yasen Zhelev
所以PHP脚本从CDN提供服务,但如果不存在,则创建并返回图像(并缓存到CDN)? - Gcoop
是的,这将是您需要的方法。 - Yasen Zhelev
很好,你想把它作为答案提交以获取积分吗? ;) - Gcoop
3个回答

2
这种系统据说读取操作比写入操作更多。
为了让您的系统运行更快,应尽量预处理以降低大部分(读取)的性能影响,即使这会增加小部分(写入)的性能影响。
在这种情况下,您应确定所需的尺寸,并在上传后立即创建这些调整大小的图像。
有效大小不是很多,大多数智能手机/平板电脑最终都只有几个可能的分辨率,因此预处理永远不会比及时慢-整体用户体验变差的东西更糟糕。
再次提醒,不要被愚弄了,任何即时处理都会更慢,因为您需要检查缓存、创建部分,然后才返回。
每个单独的图片请求都将包括缓存检查,并且某些请求将在重要时刻(读取)不必要地减慢速度,而不是在不重要的时候(上传)浪费一些 CPU 循环(例如产生永远看不到的图片)。

0
我们最近也做了类似的事情。用户上传文件后,任何对该文件版本的请求都会经过一个脚本进行检查,以确定图像是否已生成并生成或以其他方式提供服务。这里有一些额外的开销,但目前我还可以接受。然后,脚本将文件排队发送到我们的CDN(在我们的情况下是S3),一旦发送完成,就会更新本地引用,以便下次渲染页面时使用CDN的引用。重定向是您绝对要避免的事情。

0
如果您的服务器已安装Imagik,大多数服务器都会默认安装。实际上,Imagik支持动态处理,只需要构建一个相应的函数即可。很抱歉这并没有提供太多帮助,但我过去曾经使用过它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接