2012-02-22 8 views
5

내 데이터베이스에서 꽤 많은 데이터를로드하는 페이지가 있습니다. 나는 로딩 시간을 높이고 싶다. 이미 캐시 쿼리,하지만 여전히 로딩 시간은 내가 원하는 것보다 길다.세션에 캐시하거나 저장 하시겠습니까?

데이터가있는 테이블을 렌더링하고 세션을 새로 저장할 때마다 페이지를 새로 고칠 수 있습니까? ob_start()를 사용하여 외부 텍스트 파일에 넣을 생각도했습니다.

처리하는 가장 좋은 방법은 무엇입니까?

+0

병목 현상이 어디에서 발생했는지 식별하기 위해 수행 한 작업은 무엇입니까? 어떤 프로파일 링입니까? –

+1

왜 캐싱을 전혀 신경 쓸 필요없이 ** 쿼리를 더 빠르게 만들려고 시작하지 않았습니까? – zerkms

+0

@ Louis-Philippe Huberdeau 프로파일 링을 위해 어떤 도구를 권하고 싶습니까? – santa

답변

2

세션에 데이터를 저장하는 것은 좋지 않습니다. 세션에 데이터를 추가 할 때 (기본적으로) 데이터는 OS의 파일 (보통/tmp /)에 기록됩니다. 즉, 디스크를 꽤 많이 치고 많은 양의 데이터를 저장합니다.

데이터가 다음 특정 사용자는 디스크에 저장하거나 메모리에 할 수없는 경우 - (참조 : php.net/apc)

데이터를 사용자의 특정 경우는, 내가 분산에 저장하는 것이 좋습니다 같은 Memcached가 같은 캐시 (memcached.org) PHP는 활성화 할 수있는 라이브러리 (php.net/memcached)가

(사용자가 특정 I는 사용자 거래, 아이템, 쇼핑 카트 등과 같은 데이터를 의미)

로직은 기본적으로 선택한 방법에 따라 동일합니다.

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에서 활성화해야 설치할 수 있습니다.

관련 문제