PHP - 缓存和提供图像和视频文件的最佳方式

PHP - best way to cache and serve image and video files

我是 运行 像 9gag 这样的应用程序,用户可以在其中上传和观看图像和视频,所以相同的图像和视频每分钟最多被请求 100 次,这给 SSD 带来了很大的工作量,所以最后存储在 RAM 中使用媒体并从那里提供服务会更好。

我读到 memcached 和 redis 不适合这个,但没有很好的解释为什么不,有人可以解释一下吗?消失是更好的解决方案吗?它可以与 PHP 一起使用吗?

我需要最好的解决方案 PHP。

我绝对不会建议您将这些类型的工作负载存储在 Memcached 或 Redis 中,我也不建议您让 PHP 处理这些工作负载。

Varnish 确实是解决问题的方法。

为什么不使用 Memcached 和 Redis?

Memcached 和 Redis 是分布式键值存储。它们速度极快且可扩展,非常适合存储定期更改的小值。

图像和视频文件非常大,不太适合这些纯内存数据库。请记住,Redis 和 Memcached 不能直接从 Web 访问,它们是您可以从 Web 应用程序调用的缓存。

这意味着 运行 它们通过像 PHP 这样的应用程序运行时会有额外的延迟。

为什么不PHP?

不要误会我的意思,我是 PHP 的忠实粉丝,自 2007 年以来一直是 PHP 社区的一员。PHP 非常适合构建网页,但不适合处理二进制数据。

您要处理的这些类型的工作负载很容易使 PHP-FPM 或 PHP-CLI 运行时不堪重负。

可以使用 PHP,但是您需要大量的服务器来处理大规模的视频和图像处理,这将成为一种运营负担。

为什么选择清漆?

Varnish 是一个位于 Web 应用程序前面的反向缓存代理,不同于位于 Web 应用程序后面的分布式缓存,例如 Memcached 和 Redis。

这意味着您只需将图像和视频存储在网络服务器的磁盘上,Varnish 会将请求的内容缓存在内存中,而无需在每次请求时都访问网络服务器。

Varnish 专为大规模 HTTP 处理而构建,非常擅长大规模处理任何大小的 HTTP 响应。

Varnish 是 CDN 和 OTT 视频流平台用来传送图像和在线视频的软件。

使用 HLS、MPEG-DASH 或 CMAF 等视频协议,这些流式视频被分成多个片段并在清单文件中编制索引。

单个 Varnish 服务器可以以亚毫秒级延迟提供这些服务,带宽高达 500 Gbps,并发量约为 100,000 个请求。

与在 PHP 中执行此操作相比,您需要的机器数量将大大减少。

Varnish Configuration Language 是 Varnish 附带的特定于领域的编程语言,也可用于在 request/response 流程中执行某些自定义任务。

VCL 代码只需要扩展标准行为,而在 PHP 等常规开发语言中,您必须在代码中定义所有行为。

这里有一些与 Varnish 相关的资源:

甚至 Varnish Enterprise?

唯一的挑战是缓存大量 image/video 内容。因为 Varnish 将所有内容都存储在内存中,所以您需要足够的内存来存储所有内容。

虽然您可以横向扩展 Varnish 并使用一致的哈希算法来平衡多个 Varnish 服务器上的内容,但您可能仍然需要相当多的服务器。这取决于需要始终存储在缓存中的内容量。

如果您的原始 Web 平台足够强大,可以处理对未缓存的长尾内容的请求,Varnish 可以将 热门内容 存储在内存中并触发该长尾的缓存未命中内容。这样你可能不需要很多缓存服务器。这主要取决于你平台的流量模式。

Varnish 的开源版本确实有一个 file 存储引擎,但它的性能很差,并且容易出现大规模磁盘碎片。随着写入操作的增加,这会大大降低您的速度。

为了解决这个问题,开源项目背后的商业实体 Varnish Software 提出了 海量存储引擎 (MSE)。 MSE 以非常强大的方式解决了文件缓存带来的典型问题。

世界上一些最大的视频流媒体平台都在使用该技术。

有关 MSE 的详细信息,请参阅 https://docs.varnish-software.com/varnish-cache-plus/features/mse/

Varnish Enterprise and MSE are not free and open source. It's up to you to figure out what would be the cheaper solution from a total cost of ownership point of view: managing a lot of memory-based open source Varnish servers or paying the license fees of a limited amount of Varnish Enterprise servers with MSE.