2013-08-07 37 views
5

Tôi có chức năng tạo bảng có nội dung từ DB. Một số tế bào có HTML tùy chỉnh mà tôi đang đọc với file_get_contents thông qua một hệ thống templating.File_get_contents có sử dụng bộ nhớ cache không?

Nội dung nhỏ là như nhau nhưng hành động này được thực hiện có thể 15 lần (tôi có giới hạn 15 hàng trong một trang). Vì vậy, không file_get_contents cache nếu nó thấy rằng nội dung là như nhau?

+7

Câu trả lời ngắn gọn: Số – deceze

+0

file_get_contents về cơ bản chỉ là một phím tắt cho fopen, fread, fclose vv - vì vậy tôi tưởng tượng mở một con trỏ tập tin và gõ nó không được lưu trữ. – Jimbo

+0

Có chức năng đọc tập tin trong PHP mà tôi có thể chọn '$ cache = true' không? – silkfire

Trả lời

4

file_get_contents() không có cơ chế lưu vào bộ nhớ cache. Tuy nhiên, bạn có thể sử dụng viết cơ chế bộ nhớ đệm của riêng bạn.

Đây là một dự thảo:

$cache_file = 'content.cache'; 
if(file_exists($cache_file)) { 
    if(time() - filemtime($cache_file) > 86400) { 
    // too old , re-fetch 
    $cache = file_get_contents('YOUR FILE SOURCE'); 
    file_put_contents($cache_file, $cache); 
    } else { 
    // cache is still fresh 
    } 
} else { 
    // no cache, create one 
    $cache = file_get_contents('YOUR FILE SOURCE'); 
    file_put_contents($cache_file, $cache); 
} 

CẬP NHẬT các if trường hợp trước là không chính xác, bây giờ sửa chữa bằng cách so sánh với thời điểm hiện tại. Cảm ơn @Arrakeen.

+2

PHP có hỗ trợ gốc về bộ nhớ đệm được gọi là APC - http://php.net/manual/en/book.apc.php –

+7

Vì vậy ... bạn đang lưu vào bộ nhớ cache nội dung của một tệp trong một tệp ...?! ?! – deceze

+1

Điều này thực sự sẽ làm cho nó chậm hơn. – Gerry

2

Giống như @deceze nói, thường thì câu trả lời là không. Tuy nhiên, bộ nhớ cache của hệ điều hành có thể lưu vào bộ nhớ cache các tập tin được sử dụng gần đây để truy cập nhanh hơn, nhưng tôi sẽ không tính vào những thứ có sẵn. Nếu bạn muốn cache một tệp đang được đọc nhiều lần cho mỗi yêu cầu, hãy xem xét sử dụng một biến tĩnh để hoạt động như một bộ nhớ cache bên trong một hàm bao bọc.

function my_file_read($filename) { 
    static $file_contents = array(); 
    if (!isset($file_contents[$filename])) { 
    $file_contents[$filename] = file_get_contents($filename); 
    } 
    return $file_contents[$filename]; 
} 

Gọi my_file_read ($ filename) nhiều lần sẽ chỉ đọc tệp từ đĩa một lần, các cuộc gọi tiếp theo sẽ đọc giá trị từ biến tĩnh trong hàm. Lưu ý rằng bạn không nên dựa vào phương pháp này cho các tệp lớn hoặc các tệp được sử dụng chỉ một lần trên mỗi trang, do bộ nhớ được sử dụng bởi biến tĩnh sẽ vẫn tồn tại cho đến khi kết thúc yêu cầu. Giữ nội dung của các tập tin không cần thiết trong các biến tĩnh là một cách hay để làm cho tập lệnh của bạn trở thành một bộ nhớ.

Các vấn đề liên quan