2012-02-22 160 views
5

我有一个页面,有很多从我的数据库加载的数据。我想加快加载时间。我已经缓存查询,但加载时间仍然比我想要的要长。缓存或存储会话?

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

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

+0

你做了什么来确定瓶颈在哪里?任何分析? – 2012-02-22 20:23:56

+1

你为什么不开始尝试让你的**查询更快**而不用打扰缓存呢? – zerkms 2012-02-22 20:25:15

+0

@ Louis-Philippe Huberdeau您会推荐哪些工具来进行分析? – santa 2012-02-22 21:40:42

回答

2

将它存储在会话中可能不是最好的想法,当你将数据添加到会话中时(默认情况下)数据被写入OS上的文件,通常在/ 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); 
} 
0

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

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

pecl install apc 

您可能需要启用它在你的php.ini中安装。