【问题标题】:Cache or store in session?在会话中缓存或存储?
【发布时间】:2023-03-08 20:42:01
【问题描述】:

我有一个页面从我的数据库加载了相当多的数据。我想加快加载时间。我已经缓存了查询,但加载时间仍然比我希望的要长。

是否可以使用数据呈现表格并将其存储在会话中以在每次新页面刷新时加载?我什至想用 ob_start(); 把它放到一个外部文本文件中。

最好的处理方法是什么?

【问题讨论】:

  • 你做了什么来确定瓶颈在哪里?任何分析?
  • 您为什么不开始尝试让您的查询更快完全不用缓存?
  • @Louis-Philippe Huberdeau 你会推荐什么工具来进行分析?
  • 使用 EXPLAIN - dev.mysql.com/doc/refman/5.0/en/explain.html 或分析您的代码,您可以使用 XDEBUG (xdebug.org)
  • @zerkms 这是一个数据密集型应用程序,数据以多种方式呈现,包括原始数字、百分比、多维排序和绘制在图表上。查询已尽可能优化。

标签: php


【解决方案1】:

将其存储在会话中可能不是最好的主意,当您将数据添加到会话时(默认情况下),数据会写入操作系统上的文件,通常在 /tmp/ 中,这意味着您将要点击磁盘相当多,存储的数据也一样多。

如果数据不是用户特定的,那么您可以将其存储在磁盘或内存中 -(请参阅:php.net/apc)

如果数据是用户特定的,我建议将其存储在分布式缓存中,例如 Memcached (memcached.org) PHP 有一个可以启用的库 (php.net/memcached)

(用户特定的意思是用户交易、物品、购物车等数据)

你选择的任何方法的逻辑基本相同:

Memcached,用户特定数据示例:

<?php

$memcached = new Memcached();
$data = $memcached->get('shopping-cart_' . $user_id);

if (!$data) {
    $sql = $db->query("..");
    $data = array();
    while($row = $query->fetch_assoc()) {
        $data[] = $row;
    } 
    $memcached->set('shopping-cart_' . $user_id, $data);
} 
?>
<table>
<?php 
foreach ($data as $item) {
    echo '<tr><td>' . $item['name'] .' </td></tr>';
}
?>
</table>

全局数据(非用户特定)

<?php
$cache_file = '/cached/pricing-structure.something';

if (file_exists($cache_file)) {
    echo $cache_file;
} else {
    // heavy query here 
    $h = fopen('/cached/pricing-structure.something', 'w+');
    fwrite($h, $data_from_query);
    fclose($h);
}

【讨论】:

    【解决方案2】:

    如果您在单个 Web 服务器(而不是多个分布式服务器)上进行缓存,PHP APC 是一个非常易于使用的解决方案。它是一个内存缓存,类似于 memcache,但在本地运行。我会避免在会话中存储任何大量数据。

    APC是PECL扩展,可以通过命令安装

    pecl install apc
    

    您可能需要在 php.ini 中启用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-12
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多