缓存还是存储在会话中?

时间:2012-02-22 19:59:29

标签: php

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

是否可以使用数据呈现表并将其存储在会话中以加载每个新页面刷新?我甚至考虑使用ob_start()将它放在外部文本文件中;

处理它的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

将它存储在会话中可能不是最好的主意,当您向会话添加数据时(默认情况下),数据会写入操作系统上的文件,通常在/ 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);
}

答案 1 :(得分:0)

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

APC是PECL扩展,可以使用命令

进行安装
pecl install apc

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