Hỏi về cache trên server 2007-07-15 15:31:27

TG và các bạn có ai có tutorial nào sử dụng cache không share mình với. Mình đang code một trang tin tức, nhưng nếu query nhiều quá sợ chậm hoặc ai có ý flood thì chết server mất.
Cám ơn các bạn.

Tra loi 38 comment(s) kirk 2007-07-15 15:31:27

TG 2007-07-15 15:15:38

hix, lúc nay đang viết gần xong tự dưng cúp điện cái bụp nên phải ngồi viết lại :D, theo TG thì có 2 cách cache sau, mỗi cách đều có ưu và nhược của nó
Cách 1:
- Mỗi khi truy cập 1 bài viết(index.php?id=ID) thì thực hiện 2 thao tác sau:
+ kiểm tra có file ID.html trên server chưa, nếu đã có rồi thì lấy nội dung file đó sử dụng lại, nếu chưa thì query databse lấy nội dung sau đó tạo file ID.html có nội dung là nội dung query từ database.
+ Xóa cache định kỳ(1 ngày,2 ngày,..)
Cách 2:
- Tạo các file cache trước cho tất cả các bài viết (ví dụ đặt cron job cho server tự tạo lúc 12h đêm) và người dùng truy cập thì server sẽ lấy nội dung từ các file cache mà không cần query và database
+ Xóa cache định kỳ(1 ngày,2 ngày,..)

Về ưu/nhược điểm:
ưu: do các file cache được tạo trước nên server không phải query lại mysql->tốc độ nhanh và an toàn hơn cho dữ liệu
nhược:
cách 1: khi truy cập đến 1 bài có ID mà chưa có file cache(ID.html chưa tồn tại) thì server tốn thời gian query->chậm trong lần đầu truy cập bài đó, còn cách 2 thì tất cả các file cache đã được tạo nên không bị nhược điểm này.
cách 2:dung lượng ỗ đĩa chứa file cache lớn hơn, do tất cả file cache đều được tạo, nếu vì lí do gì đó file ID.html bị xóa thì bài viết đó sẽ không truy cập được trong ngày hôm đó, trong khi đó với cách 1 thì file nào không ID.html nào không tồn tại thì được xử lý như lần đầu truy cập.

Về việc cache thành file .xxx là do người code, có thể là 1 file .html,.php,.xml... điều đó phụ thuộc vào cách xử lý riêng của mỗi lâp trình.

Về xóa file cache định kỳ, có thể dùng cronjob của server đê tự clear sau 1 khoảng thời gian nhất định hoặc chỉ dùng code

Đây là vài kinh nghiệm về cache, anh em tham khảo, và cùng thảo luận cache theo cách nào là phù hợp nhất

Tra loi

Lamborghini 2007-07-15 15:21:48

Em thấy PEAR có một lớp về cache file(lớp stragetry gì đó) - một framework cho cache.Có thể dùng luôn hoặc mô phỏng lại.
Theo em, nếu dùng ajax có lẽ nên cache thành file .xml

Tra loi

TG 2007-07-15 15:25:46

TG thì thích cái nào mình tự viết hơn, có thể là minh xem qua cái đã viết sẵn và bắt chước viết lại, nhưng khi minh viết thì minh sẽ dễ control về sau,

Tra loi

Sữa 2007-07-15 15:33:25

Vậy ngoài cách cache bằng html còn cách khác?

Tra loi

TG 2007-07-16 16:49:03

dĩ nhiên là bạn có thể cache bằng php,xml,html,... cache bằng cách nào thì cốt yếu cũng là ghi lại dữ liệu ra file và sử dụng lại dữ liệu đó thay vì connect trực tiếp từ database, thế thôi :)

Tra loi

darkera13 2007-07-16 16:36:03

Sặc, cache kiểu đó chắc chết quá. Có site hàng triệu bài viết thì chắc cache sặc máu quá. Kiểu này á chỉ có cách dùng template và cache các file template để giảm bớt thời gian complie các biến được dùng đi dùng lại nhiều -> giảm được thời gian truy xuất(tất nhiên là vẫn phải query vô cơ sở dữ liệu để lấy các phần thay đổi ra).

Tra loi

TG 2007-07-16 16:44:34

Kiểu này á chỉ có cách dùng template và cache các file template để giảm bớt thời gian complie các biến được dùng đi dùng lại nhiều -> giảm được thời gian truy xuất(tất nhiên là vẫn phải query vô cơ sở dữ liệu để lấy các phần thay đổi ra).

thì bạn cũng phải cache nó lại thành file .php,.html,... thôi, thứ 1: đã là cache là phải lưu ra file,
thứ 2: cache là mình sẽ giữ lại phần dữ liệu đã được complie trừ các thông tin về thông tin đăng nhập, cái này phụ thuộc vào cách code của coder và mục tiêu của cache là hạn chế query database, còn giảm bớt thời gian complier là 1 phần thôi.

Tra loi

pdh 2007-07-16 16:33:37

đúng rồi phpbb3 cũng làm như vậy cache template

Tra loi

Lamborghini 2007-07-16 16:14:44

TG thì thích cái nào mình tự viết hơn, có thể là minh xem qua cái đã viết sẵn và bắt chước viết lại, nhưng khi minh viết thì minh sẽ dễ control về sau

em cũng thích tự viết nhưng cũng nên tham khảo để có ý tưởng.
Vậy ngoài cách cache bằng html còn cách khác?

bây giờ xuất hiện một xu hướng dùng XML làm cơ sở dữ liệu. Em nghĩ ra một ý tưởng (có lẽ hơi ngu) là cache các query, dữ liệu của SQL vào XML, sau đó dùng một query khác lấy dữ liệu từ XML.Khi dữ liệu SQL thay đổi thì dữ liệu XML cũng thay đổi. Như vậy có thể truy vấn nhanh hơn, cũng bảo mật  hơn(!?).Nhưng coder sẽ mệt.
By the way, anh TG share luôn code PHPBS phiên bản 2 này đi.

Tra loi

darkera13 2007-07-16 16:21:52

thì bạn cũng phải cache nó lại thành file .php,.html,... thôi, thứ 1: đã là cache là phải lưu ra file,
thứ 2: cache là mình sẽ giữ lại phần dữ liệu đã được complie trừ các thông tin về thông tin đăng nhập, cái này phụ thuộc vào cách code của coder và mục tiêu của cache là hạn chế query database, còn giảm bớt thời gian complier là 1 phần thôi.


Dạ nhưng mà em nói bác biết bác cache template thì sẽ khác bác ạ, 1 site khoảng 100~200 template file thoai.

Nhưng bác cache theo như bố TG chắc chít quá, mỗi 1 bài viết cache 1 file. Giả sử trang tin của bác có cả triệu bài viết hãy tưởng tượng điều gì xảy ra hử :D

Tra loi

darkera13 2007-07-16 16:24:28

bây giờ xuất hiện một xu hướng dùng XML làm cơ sở dữ liệu. Em nghĩ ra một ý tưởng (có lẽ hơi ngu) là cache các query, dữ liệu của SQL vào XML, sau đó dùng một query khác lấy dữ liệu từ XML.Khi dữ liệu SQL thay đổi thì dữ liệu XML cũng thay đổi. Như vậy có thể truy vấn nhanh hơn, cũng bảo mật  hơn(!?).Nhưng coder sẽ mệt.


Cái nỳ thằng phpBB3 cũng có luôn, cache SQL Query.

Tra loi

TG 2007-07-16 16:46:09

cache XML là tối ưu nhất vì dung lượng nhỏ, truy xuất nhanh. nhưng song song đó phải code phần lấy data từ file XML, cái này  thì hơi mệt :D

Tra loi

kirk 2007-07-17 17:29:16

Rời ạ. Nói đi nói lại, nói chung thì mỗi người đều có cách riêng ưa thích của mình, có thể cách riêng đó chưa tối ưu nhưng sẽ dễ quản lí khi code ngày càng lớn. Dần dần rồi sẽ rút ra kinh nghiệm bản thân thôi. Nhưng ai đó share giùm 1 cái tuts ngắn gọn cho học hỏi phát. Cám ơn nhiều.

Tra loi

TG 2007-07-17 17:51:10


cái này phụ thuộc rất nhiều vào cách code của bạn, TG viết 1 đoạn demo theo cách của TG.Giả sử mõi bài viết sẽ có url dạng index.php?id=ID, và file cache tương ứng là ID.php
Code mẫu:
<?php
$id
= $_GET['id'];
if(
file_exists($id.'.html')) {
include(
$id.'.html');
exit();
}else{
ob_start(); // điểm bắt đầu của file cache
// Query dữ liệu in nội dung website như bình thường
$content = ob_get_contents(); // lấy phần nội dung đã in ra
ob_clean();
//tạo file
$fp= fopen($id.'.html','w');
if(
$fp) fwrite($fp,$content);
fclose($fp);
}
?>
Hy vọng ví dụ nhỏ này giúp bạn hình dung được sơ lược về việc cache

Tra loi

kirk 2007-07-18 18:28:00

Cám ơn TG nhé. Cách code của mình và của bạn giống nhau và mình cũng định dùng cache dạng này. :D

Tra loi

G.K 2007-07-29 03:09:26

@darkera13:
Có gì đâu mà chết, sao mà suy nghĩ thiển cận vậy. Check thời gian rồi sau đó xóa đi những entry ko đc truy cập là xong.

Tốt nhất là nên kết hợp với cache bằng trình duyệt + cache template + lưu file. Đó là cách làm hiện tại của 1 vài báo điện tử.

Tra loi

heosuaquay 2007-09-07 03:49:17

có bác nào xài memcache chưa

Tra loi

toiyeuphp 2007-09-07 09:20:55

memcache dành cho site có dùng nhiều server để cân tải dữ liệu. Tham khảo source wikimedia xem nó dùng như thế nào.

Tra loi

GnuhNguyen 2007-12-08 06:05:47

hì hì, với 1 cái host tầm 5GB thì cache cả năm ^^=> lo gì điều ấy. Cache toàn text thì tốn mấy space nhờ ...

Tra loi

changtraingheo 2007-12-09 11:15:47

trang phpbasic này có cache lời bình ko nhỉ, vì nó hầu như là cập nhật thường xuyên

Tra loi

cb_dethuong 2007-12-10 01:19:46

Nếutrang có các thông tin cậo nhật quá nhanh như chat chẳng hạn thì mình ko dùng cache
Chỉ khi nào làm trang dạng tin tức hay bài viết thì mới làm. Nếu dùng cache thì mình chỉ làm cho những tin hay bài viết mới nhất mỗi hạng mục hay modules, còn nếu các bài cũ thì dùng truy vấn

Tra loi

Phong Trần 2008-01-03 01:03:32

Có rất nhiều cách cache khác nhau:
1. Cache query: chỉ kết các kết quả lấy từ DB ra file, dùng cho loại dữ liệu hay thay đổi

2. Static Cache: Cache khối thành các file tĩnh (như file HTML) dùng cho loại dữ liệu ít thay đổi (như chuyên mục tin chẳng hạn)

3. MemCache: Lưu nội dung cache vào RAM nhằm tăng tốc độ lấy dữ liệu. Đây là cách cache hiệu quả nhất mà các site lớn đang dùng.

Tra loi

cocbay 2008-01-03 08:43:31

Còn 1 cache nữa, không biết gọi là gì, ví dụ khi user dùng ajax để load nội dung, mình sẽ lưu nội dung này vào 1 mãng javascript, sau đó, nếu user muốn load nội dung đó lại 1 lần nữa thì chỉ cần show nội dung từ mãng javascript đã lưu đó ra, không cần dùng ajax nữa.... Cách này hơi phức tạp.

Tra loi

tutt 2008-01-11 01:19:02

mình làm trang tinhca.nhacso.net, tất cả điều cache trên server, chỉ cache nội dung thôi, vì vậy dù database chết, mình vẫn lấy được nội dung từ file cache...Hơn nữa sau này thay đổi giao diện, cũng không có gì phải quan tâm đến dữ liệu, quá đơn giản.

Hiện server đang chết, đang chuyển server, nên không truy cập được trang này đâu nhá.

Tra loi

Về Đâu 2008-01-11 08:24:40

nếu xài memcache xài zend perfoment suite hay hơn. tuy tốn tiền nhiều nhưng good dã man

Tra loi

web20vn.com 2008-01-11 06:07:58

Bác có không share em xài thử với. ZPS là giải pháp tăng hiệu suất cho PHP, còn MemCached là giải pháp cache phân tán. Nếu kết hợp cả 2 thì càng tốt.

Tra loi

chuột jerry 2008-01-16 11:05:32

tôi có 1 vấn đề mà ko biết giải quyết làm sao. Làm sao có thể phân trang khi đã tạo cache rồi. Có nghĩa là như thế này. Tôi tạo cache cho mục tin tức có các bài viết là A,B,C. Bây giờ tôi đưa mẫu tin D vào cache bây giờ tôi muốn phân trang sau.
Trang 1 có các mẫu tin D,C,B. Trang 2 có mẫu tin A. RỒi lở tôi thêm mẫu tin E vào. Thì trang 1 có E,D,C. TRang 2 có B,A thì làm sao

Tra loi

TG 2008-01-16 03:02:39

Khi thêm 1 mẫu tin mới thì bạn phải xóa file cache đi(hoặc là đặt tự động xóa trong bao nhiêu giây đó) nếu chưa xóa cache thì  phải chịu thôi

Tra loi

123456 2008-02-19 11:27:07

Phân trang khi có bài mới:
Đọc các file cache vào 1 mảng (lưu tên file, không cần phần đuôi file) và so sánh với các ID bài viết trong data. chắc chắn mảng lưu ID trong data nhiều hơn mảng tên file đã cache; so sánh 2 mảng, nếu:
- nhau thì ko có gì pải nói, phân trang theo mảng file or ID
- nếu mảng tên file hơn (database đã xóa đi 1 số bài) thì tùy theo, sẽ view và phân trang theo mảng tên file cache. nên xóa file đã cache khi xóa 1 news <-- sẽ không có trường hợp này.
- nếu (chắc chắn) mảng ID lớn hơn (điều đang bàn), có thể làm:
+ cache bài mới rồi phân trang theo mảng file đã cache. hoặc:
+ phân trang theo mảng ID và khi view thì có thể theo file cache hoặc load từ data.
CY: tên file cache và ID bài viết là trùng nhau nên khi phân trang ta ko nên bận tâm nhiều mà khi view kiểm tra nếu cache rồi thì include, còn chưa thì cache rồi include hoặc load trực tiếp. :)

Tra loi

montecristo 2008-03-16 12:00:56

3. MemCache: Lưu nội dung cache vào RAM nhằm tăng tốc độ lấy dữ liệu. Đây là cách cache hiệu quả nhất mà các site lớn đang dùng.
Các bạn có thể nói rõ hơn về kiểu Memcache được không.

Tra loi

tranthanhtu888@yahoo.com 2008-10-22 03:52:33

download memcached for win http://jehiah.cz/projects/memcached-win32/

Install and Config php.ini http://bnok.vn/hungbo/2008/08/25/installing-memcache-on-windows-for-php/

Vào php.net xem hướng dẫn dùng memcache, very easy.

Tra loi

thích học hỏi 2009-05-12 02:15:37

@TG cronjob của server đê tự clear sau 1 khoảng thời gian nhất định hoặc chỉ dùng code

Bạn ơi cho mình xin đoạn cronjob để xoá cache của server với, hoặc chỉ dùng code là sao hả bạn ?

Tra loi

TG 2009-05-13 01:55:41

Bạn tham khảo ở bài này: http://phpbasic.com/230.html

Tra loi

thích học hỏi 2009-05-14 02:49:44

Ý mình muốn hỏi câu lệnh cronjob đó là gì

Tra loi

cac cac cac cac cac cac cac cac cac 2009-08-05 10:40:01

caccac cac cac cac cac cac cac cac cac cac

Tra loi

Tống Kiện Phi 2009-08-05 11:00:27

Cronjob ko phải là lệnh, nó là 1 chức năng trong cpanel, có thể hiểu nôm na nó là các nhiệm vụ được liên tục thực hiện sau một khoảng thời gian xác định

p/s cac: mày đi ăn cứt đi

Tra loi

Alex 2009-08-31 01:44:24

Mình thấy trong vbulletin nó dùng cache bằng array.

Ví dụ:

### start stylecache ###
$stylecache = array (
  -1 =>
  array (
    1 =>
    array (
      0 =>
      array (
        'styleid' => '1',
        'title' => 'Default Style',
        'parentid' => '-1',
        'displayorder' => '1',
        'userselect' => '1',
      ),
    ),
  ),
);
### end stylecache ###

### start languagecache ###
$languagecache = array (
  1 =>
  array (
    'languageid' => '1',
    'title' => 'English (US)',
    'userselect' => '1',
  ),
);
### end languagecache ###


Khi load trang lên, nó vào trang này đọc ra cho bên ngoài, Ai rành hơn về vbulletin xin cho thêm thông tin.

Thank:)

Tra loi

duy 2009-10-01 04:25:49

hieu chet lien . ^^ .d.đ.dddddddd

Tra loi

Y kien