Tìm hiểu, làm việc với cache trong NukeViet
Sử dụng hệ thống cache linh hoạt và tối ưu, NukeViet vận hành nhẹ nhàng và giảm tải đáng kể cho hệ thống. Nếu biết tận dụng những cơ chế này trong dự án với NukeViet của bạn, bạn có thể tạo ra một hệ thống lớn mà không cần chi phí đầu tư hạ tầng quá cao. Bài viết này mình xin giới thiệu về cache NukeViet và cách sử dụng nó.
Cache là gì?
Cache là một vùng nhớ đệm, lưu trữ dữ liệu tạm thời. Cụ thể, trên hệ thống web, cache lưu trữ các đoạn mã hoặc tập hợp đoạn mã HTML trả về từ sever dưới dạng các tập tin. Các tập tin này được sử dụng khi client gửi yêu cầu giống với các yêu cầu gửi trước đó, đã được sever xử lý, trả về kết quả và lưu vào tập tin tương ứng.
Tại sao phải sử dụng cache?
- Truy xuất dữ liệu từ tập tin trên host nhanh hơn so với truy cập trực tiếp đến Cơ sỡ dữ liệu (CSDL).
- Nếu không dùng cahce, ứng với mỗi request từ phía người dùng (1 người), sever phải xử lý rất nhiều, truy vấn liên tục vào CSDL để đảm bảo thông tin đầy đủ, chính xác. Hãy tưởng tượng, cùng một lúc có 100, 1000 người truy cập hệ thống, thì sever phải làm việc "cật lực" đến thế nào, những sever có cấu hình không cao có thể sẽ treo, không thể truy cập được.
Sử dụng cache trên NukeViet như thế nào?
NukeViet thường sử dụng 2 hình thức cache:
1. Cache toàn trang:
Khi một trang được truy cập, hệ thống lưu lại cache tương ứng với URL của trang đó.
Ví dụ: Cache sử dụng trong trang chính của news. Bạn có thể xem code mẫu tại modules/news/funcs/main.php
Hàm này có tác dụng lấy tên file cache đã lưu trước đó. Nếu có thì trả về true, ngược lại là false.
Hàm nv_set_cache( tên module, tên file cache, nội dung );
Hàm này có tác dụng tạo ra file cache (nếu chưa có). Các file được lưu trữ mặc định ở thư mục cache/tên-module
2. Cache SQL
Nếu cache toàn trang lưu nội dung HTML (được mã hóa) vào tập tin cache, thì cache SQL lưu dữ liệu ở kiểu mảng (PHP). Dạng này được sử dụng nhiều trong các block. Khi dùng cache SQL, các câu truy vấn giống nhau sẽ chỉ được thực hiện một lần.
Chú ý quan trọng: Nếu câu lệnh SQL bạn có sử dụng điều kiện là Time current - Thời gian hiện tại thì không được sử dụng cache, bởi lẽ ở mỗi thời điểm thì dòng lệnh SQL sẽ khác nhau, nó sẽ tạo ra một đống “rác” chứ không còn là cache nữa.
Ví dụ: Cache SQL sử dụng trong block global.new_files.php của module download (và các block của news,....). Mở modules/news/blocks/global.block_groups.php để xem code mẫu.
Hàm nv_db_cache( câu truy vấn, khóa - chỉ số mảng, tên module );
Hàm này có tác dụng thực hiện câu truy vấn, trả về một mảng (PHP) dữ liệu. Nó cũng xử lý dữ liệu, ghi vào file cache. Các câu truy vấn sau nếu giống câu truy vấn đã được ghi vào file thì không thực hiện truy vấn vào CSDL lại nữa.
Các hàm liên quan:
Hàm nv_del_moduleCache( tên module )
Hàm này có chức năng xóa file cache đã được lưu trước đó. Khi chạy, tất cả file cache được sinh ra bởi module này sẽ được xóa. Thường được sử dụng khi module có thay đổi về dữ liệu, xóa cache cũ để client tải lại dữ liệu mới.
Cache là một vùng nhớ đệm, lưu trữ dữ liệu tạm thời. Cụ thể, trên hệ thống web, cache lưu trữ các đoạn mã hoặc tập hợp đoạn mã HTML trả về từ sever dưới dạng các tập tin. Các tập tin này được sử dụng khi client gửi yêu cầu giống với các yêu cầu gửi trước đó, đã được sever xử lý, trả về kết quả và lưu vào tập tin tương ứng.
Tại sao phải sử dụng cache?
- Truy xuất dữ liệu từ tập tin trên host nhanh hơn so với truy cập trực tiếp đến Cơ sỡ dữ liệu (CSDL).
- Nếu không dùng cahce, ứng với mỗi request từ phía người dùng (1 người), sever phải xử lý rất nhiều, truy vấn liên tục vào CSDL để đảm bảo thông tin đầy đủ, chính xác. Hãy tưởng tượng, cùng một lúc có 100, 1000 người truy cập hệ thống, thì sever phải làm việc "cật lực" đến thế nào, những sever có cấu hình không cao có thể sẽ treo, không thể truy cập được.
Sử dụng cache trên NukeViet như thế nào?
NukeViet thường sử dụng 2 hình thức cache:
1. Cache toàn trang:
Khi một trang được truy cập, hệ thống lưu lại cache tương ứng với URL của trang đó.
Ví dụ: Cache sử dụng trong trang chính của news. Bạn có thể xem code mẫu tại modules/news/funcs/main.php
if( !defined( 'NV_IS_MODADMIN' ) and $page < 5 )// Nếu không phải là người quản trị, và số trang bé hơn 5, thì ghi lại cache nôi dung trang tin tức{ // Khai báo tên file cache $cache_file = NV_LANG_DATA . '_' . $module_info['template'] . '-' . $op . '-' . $page . '-' . NV_CACHE_PREFIX . '.cache'; // Nếu đã tồn tại file cache lưu trước đó, thì gán $contents (nội dung) bằng nội dung file cache đó. if( ($cache = nv_get_cache( $module_name, $cache_file )) != false ) { $contents = $cache; }}// Nếu không tồn tại file cache thì xử lý dữ liệu......if( empty( $contents ) ){ // Xử lý dữ liệu ........................ $contents = 'Dữ liệu đã xử lý'; if( !defined( 'NV_IS_MODADMIN' ) and $contents != '' and $cache_file != '' ) { // ...... và tạo file cache khi xử lý dữ liệu xong nv_set_cache( $module_name, $cache_file, $contents ); }}
Hàm nv_get_cache( tên module, tên file cache )Hàm này có tác dụng lấy tên file cache đã lưu trước đó. Nếu có thì trả về true, ngược lại là false.
Hàm nv_set_cache( tên module, tên file cache, nội dung );
Hàm này có tác dụng tạo ra file cache (nếu chưa có). Các file được lưu trữ mặc định ở thư mục cache/tên-module
2. Cache SQL
Nếu cache toàn trang lưu nội dung HTML (được mã hóa) vào tập tin cache, thì cache SQL lưu dữ liệu ở kiểu mảng (PHP). Dạng này được sử dụng nhiều trong các block. Khi dùng cache SQL, các câu truy vấn giống nhau sẽ chỉ được thực hiện một lần.
Chú ý quan trọng: Nếu câu lệnh SQL bạn có sử dụng điều kiện là Time current - Thời gian hiện tại thì không được sử dụng cache, bởi lẽ ở mỗi thời điểm thì dòng lệnh SQL sẽ khác nhau, nó sẽ tạo ra một đống “rác” chứ không còn là cache nữa.
Ví dụ: Cache SQL sử dụng trong block global.new_files.php của module download (và các block của news,....). Mở modules/news/blocks/global.block_groups.php để xem code mẫu.
$db->sqlreset( )->select( 't1.id, t1.catid, t1.title, t1.alias, t1.homeimgfile, t1.homeimgthumb,t1.hometext,t1.publtime' )->from( NV_PREFIXLANG . '_' . $site_mods[$module]['module_data'] . '_rows t1' )->join( 'INNER JOIN ' . NV_PREFIXLANG . '_' . $site_mods[$module]['module_data'] . '_block t2 ON t1.id = t2.id' )->where( 't2.bid= ' . $block_config['blockid'] . ' AND t1.status= 1' )->order( 't2.weight ASC' )->limit( $block_config['numrow'] );$list = nv_db_cache( $db->sql( ), '', $module );
Hàm nv_db_cache( câu truy vấn, khóa - chỉ số mảng, tên module );
Hàm này có tác dụng thực hiện câu truy vấn, trả về một mảng (PHP) dữ liệu. Nó cũng xử lý dữ liệu, ghi vào file cache. Các câu truy vấn sau nếu giống câu truy vấn đã được ghi vào file thì không thực hiện truy vấn vào CSDL lại nữa.
Các hàm liên quan:
Hàm nv_del_moduleCache( tên module )
Hàm này có chức năng xóa file cache đã được lưu trước đó. Khi chạy, tất cả file cache được sinh ra bởi module này sẽ được xóa. Thường được sử dụng khi module có thay đổi về dữ liệu, xóa cache cũ để client tải lại dữ liệu mới.
Những tin mới hơn
Những tin cũ hơn