题
方案
我正在构建一个Web应用程序,其中可以在飞行中生成报告(基于从SQL数据库检索的信息)。这些报告将包含图表,也可以在飞行中生成。因为这些图表包含敏感信息,所以使用第三方图表API(即:Google Charts)是不可能的。
问题
我正在使用PHP的GD扩展来生成这些图表。这很慢。缓存是要走的方式,但问题是有大量可能的图表;虽然我相信所要求的大部分图表将是之前生成的图表。
部分解决方案
图表是使用数据和其他信息(大小,图表类型等)生成的。因为这些可以唯一地标识图表,所以我根据这些信息给每张图表唯一的哈希,并保存它。现在我可以计算新请求的图表的哈希,看看我是否已经呈现了它。
此问题是碰撞的事件。若要解决这个问题,我正在考虑在SQL表中保存哈希和序列化形式的数据。然后,如果我有一个缓存命中,我仍然会比较数据本身。
我过于推动这个? (这是一个160位散列 - SHA1)
有没有更好的方法来处理这个?
解决方案
我正在使用PHP的GD扩展来生成这些图表。它很慢。
我怀疑它不是gd,这是慢的一点。最有可能的候选者是处理数据的处理(从数据库?)。在这种情况下,您可以从优化数据库模式/和/或使用预先统一数据获得显着的好处。
虽然您可能还考虑缓存查询输出,但除非您在其他地方使用相同的数据,否则它可能更简单地缓存图形图像。
这个问题是碰撞的事件。
过早优化 - 它不会发生。但如果您真的必须,拆分您使用的元数据以生成图形并将其存储在单个文件中(再次通过相同的哈希索引) - 然后在运行时进行比较。如果你设法碰撞,我们将有一个鞭打,给你买饮料。
我会建议看看JPGraph - 这是一个很好的软件,并且具有缓存内置。
c。
其他提示
最可能如果您的散列数据长度小于160位,则您可以安全。否则,就像你说,可能会发生冲突,并且比较数据是必要的。
看看 chartdirector 我们在工作中使用它,它不依赖GD库应该更快。