【问题标题】:Caching and session variables (PHP, MySQL...)缓存和会话变量(PHP、MySQL...)
【发布时间】:2013-11-12 19:08:58
【问题描述】:

对于冗长的帖子提前道歉,只是想清楚地解释情况。

我创建了一个 PHP 驱动的网站,用于搜索大型(数百万条记录)MySQL 数据库。在搜索页面上,您有常用的搜索条件表单。由于人们经常使用该站点的方式,搜索条件被保存到会话变量中,因此如果重新加载搜索页面,以前的条件仍保留在表单字段中(当然,有一个手动重置条件的按钮)。这本身就可以正常工作。

我还有两个语言选择链接,它们将语言选择存储在会话变量中(使页面标题加载适当的本地化文件),如上所述,这本身也可以正常工作。

问题在于,当用户获得搜索结果、人员列表,并想要打开一个人的详细信息(因此从 search.php 到 info.php)然后想要返回人们通过后退按钮列出,重新加载前一页需要很长时间,因为页面重新发送 MySQL 查询等,而不是返回到缓存页面。有时甚至可能需要 5 秒或更长时间,因为查询会产生多达 5000 个结果 - 但即使说,重新加载 200-500 个结果也需要很长时间,因为数据库本身很大而且不是世界上最快的。而且限制结果的数量并不实际。

乍一看,显而易见的解决方案似乎是启用浏览器缓存。这正是我通过 PHP 标头和编译指示控件所做的。一切似乎都很好,因为回到列表基本上是瞬间的。但是,我意识到启用缓存意味着更新的会话变量不起作用。在进入不同页面后重新加载搜索页面时,新的搜索条件无法正确替换旧的搜索条件,即使您选择了另一种语言,页面也会以您之前使用的语言打开,因为这是它们被缓存的方式!您可以通过 F5 强制语言更新,但这似乎对搜索条件没有多大帮助。但即便如此,F5-spam 也不是真正的答案,它需要自动运行。

长话短说,我如何在不使会话变量无用的情况下快速打开搜索结果列表?或者在使用后退按钮时我是否只需要处理缓慢的页面加载,从而惹恼用户?我也真的不想在新页面中打开 info.php。

【问题讨论】:

  • 您在 search.php 的调用中使用相同的 URL 和查询吗?
  • 调用 search.php 和 info.php 的会话密钥是否相同?
  • 这听起来可能很傻,但你考虑过灯箱吗?只要他们正在查看的用户信息不是太长,就可以通过不强迫您的查看者离开页面来为您的页面提供更干净的无刷新质量。您可以通过 AJAX 从用户那里提取数据。只是一个想法。
  • 你有没有做过破坏 MySQL 查询缓存的事情? dev.mysql.com/doc/refman/5.1/en/query-cache.html
  • search.php 使用 GET,因此变量在 URL 中,因此当从 info.php 返回时,url 与上次相同,没有提示重新发送表单或任何内容。

标签: php mysql session caching


【解决方案1】:

您是否考虑过在文件系统上缓存数据库结果?我发现 Zend Framework 缓存类非常易于使用。您可以使用所需的任何信息来区分缓存结果和其他缓存结果。所以缓存可以根据需要细化。

http://framework.zend.com/manual/1.12/en/zend.cache.introduction.html

您不需要使用整个 Zend 框架来使用该类。您可以单独使用它。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 2012-04-30
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多