2012-03-04 45 views
8

Tôi đang tải tệp XML từ đĩa bằng cách sử dụng file_get_contents và như một bài kiểm tra tôi thấy tôi có thể tải tệp 156K bằng cách sử dụng file_get_contents() 1.000 lần trong 3,99 giây. Tôi đã subclassed phần mà không tải và thay thế nó bằng một lớp memcache, và trên máy dev của tôi tìm thấy tôi có thể làm 1000 tải của cùng một tài liệu trong 4,54 giây.Tại sao tệp_get_contents nhanh hơn memcache_get?

Tôi đánh giá cao rằng file_get_contents() sẽ làm một số bộ nhớ đệm, nhưng có vẻ như nó thực sự nhanh hơn một kỹ thuật bộ nhớ đệm nổi tiếng. Trên một máy chủ duy nhất, hiệu suất của file_get_contents() có tốt không?

Tôi đang sử dụng PHP 5.2.17 qua Macports, OS X 10.6.8.

Chỉnh sửa: Tôi đã tìm thấy trên tài liệu XML có kích thước này, có một lợi ích nhỏ khi sử dụng cờ MEMCACHE_COMPRESSED. 1.500 lượt tải qua memcache được thực hiện trong 6.44 giây (với nén) thay vì 6.74 (không có). Tuy nhiên cả hai đều chậm hơn file_get_contents, có cùng số lượng tải trong 5,71 giây.

Trả lời

8

Vì tệp_get_contents mmap của tệp và vì vậy bạn sẽ chỉ có một vài cuộc gọi hệ thống tệp và điều này sẽ kết thúc trong bộ nhớ cache của tệp hệ thống. memcache liên quan đến các cuộc gọi out-of-process để memcached (và ra khỏi máy chủ trên một cụm thực hiện).

Hiệu suất của file_get_contents() chủ yếu phụ thuộc vào loại hệ thống tệp, ví dụ tệp trên hệ thống tệp được gắn NFS không được định vị và quyền truy cập này có thể chậm hơn rất nhiều. Ngoài ra trên một máy chủ đa người dùng, bộ nhớ cache của hệ thống tệp có thể bị xóa nhanh chóng bởi các quy trình khác trong khi bộ nhớ cache ghi nhớ gần như chắc chắn sẽ nằm trong bộ nhớ.

+0

Ah, thú vị. Bạn đang nói rằng trên một máy chủ web trong đó các tập tin XML khác nhau đang được nạp tất cả các thời gian, hiệu suất của phương pháp tiếp cận memcache _might_ trong một số trường hợp được tốt hơn? (Tôi hy vọng sẽ triển khai trên một VPS Linux cấp thấp, có lẽ với 512MB RAM - rất nhiều miễn phí cho 64M mặc định mà memcache dự trữ theo mặc định.) – halfer

+0

Tuy nhiên, tôi tự hỏi liệu ganh đua có thể loại bỏ một thứ gì đó trong bộ nhớ cache của FS sẽ có khả năng loại bỏ một thứ gì đó ra khỏi bộ nhớ cache của memcache ';-) ' – halfer

+0

Trên một VPS dành riêng cho một Ứng dụng, bạn sẽ có thể có được mọi thứ để phù hợp. Tuy nhiên giá trị của nó "đúng kích thước" lưu trữ của bạn: sử dụng 32M cho memcache hoặc ít hơn nếu đó là đủ. Hãy chắc chắn rằng bạn sử dụng APC hoặc Xcache nếu ứng dụng của bạn dựa trên PHP. Đừng quên rằng bạn có thể nhận được cổ tức hiệu suất tốt từ việc điều chỉnh cache MySQL nếu bạn sử dụng MySQL, ... 512Mb là đủ nhỏ mà bạn cần phải phân bổ một cách khôn ngoan. – TerryE

3

file_get_contents là cách đơn giản nhất để truy xuất tệp. Hệ điều hành cơ bản (đặc biệt là Linux) đã có các cơ chế lưu bộ nhớ đệm hiệu quả. Bất cứ điều gì khác bạn chỉ cần tạo ra trên cao và làm chậm mọi thứ xuống.

Memcache sẽ có ý nghĩa nếu bạn tải các tệp này từ một vị trí từ xa.

Chỉnh sửa: Điều này không nhất thiết đúng là tệp_get_contents là cách đơn giản nhất. fopen/fget có thể thậm chí còn nhanh hơn - Tôi không biết. Nhưng sự khác biệt nên nhỏ so với độ phức tạp của một lớp đệm.

+0

Tôi hy vọng bạn đã đúng. Tôi đoán tôi đã mong đợi 'file_get_contents' để thực hiện hoạt động đĩa _some_ mỗi lần (có lẽ để xem nếu một tập tin đã thay đổi), trong khi' memcache_get' không cần gì cả. Do đó kỳ vọng của tôi là cách tiếp cận memcache sẽ nhanh hơn ... tuy nhiên nó không lãng phí thời gian, vì tôi nghĩ rằng tôi vừa học được điều gì đó :) – halfer

+0

Trên một mức độ rất tổng quát, bộ nhớ đệm FS thực hiện tương tự như PHP của bạn memcache - ngoại trừ việc nó chuyên sâu hơn nhiều và không được viết bằng ngôn ngữ kịch bản. :) Bộ nhớ cache không cần truy cập tệp lần thứ hai trừ khi nội dung tệp đã thay đổi. Một cơ chế lưu bộ nhớ đệm riêng biệt sẽ có ý nghĩa nếu có rất nhiều hoạt động IO trên hệ thống đang xả bộ nhớ cache của tệp. – Someone

+0

Một dấu tích cho @TerryE, +1 cho Mantriur - cả hai đều rất hữu ích. Cảm ơn bạn. – halfer

1

Lưu trữ các tệp XML trong memcache có ý nghĩa rất ít đối với tôi.

Tôi muốn lưu trữ các giá trị được phân tích cú pháp, tiết kiệm cho tôi cả việc đọc và phân tích cú pháp.

+0

Thật vậy, đó là ý định ban đầu của tôi - cho đến khi tôi phát hiện ra rằng các đối tượng SimpleXML không thể được tuần tự hóa. Rõ ràng chúng chứa tài nguyên, tất nhiên không thể được biểu diễn đầy đủ ở dạng tuần tự. – halfer

+0

tài nguyên? nguồn lực gì? –

+0

Tài nguyên: xem [câu trả lời này] (http://stackoverflow.com/a/5264628/472495). – halfer

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