2008-11-25 22 views
14

Tôi đang thêm hình đại diện cho công cụ diễn đàn tôi đang thiết kế và tôi đang tranh luận xem có nên làm điều gì đó đơn giản không (hình ảnh diễn đàn có tên .png) và sử dụng PHP để kiểm tra xem tệp có tồn tại trước khi hiển thị hay không một cái gì đó phức tạp hơn một chút (nhưng không nhiều) và sử dụng một trường cơ sở dữ liệu để chứa tên của hình ảnh để hiển thị.File_exist() trong PHP là một hoạt động rất tốn kém?

Tôi muốn sử dụng phương pháp file_exists() một cách dễ dàng, vì điều đó giúp tôi dễ dàng quay lại hình đại diện "mặc định" nếu hình đại diện hiện tại chưa tồn tại và đơn giản triển khai mã khôn ngoan. Tuy nhiên, tôi lo lắng về hiệu suất, vì điều này sẽ được chạy một lần cho mỗi người dùng được hiển thị cho mỗi lần tải trang trên trang diễn đàn đọc. Vì vậy, tôi muốn biết, hàm file_exists() trong PHP có gây ra bất kỳ sự chậm trễ lớn nào có thể gây ra các lần truy cập hiệu suất đáng kể trong điều kiện giao thông cao không?

Nếu không, tuyệt. Nếu có, ý kiến ​​của bạn về các lựa chọn thay thế để theo dõi hình ảnh do người dùng tải lên là gì? Cảm ơn!

PS: Sự khác biệt về mã mà tôi có thể thấy là các phiên bản kiểm tra tệp cho phép các tệp nói, trong khi biểu mẫu cơ sở dữ liệu tin tưởng rằng cơ sở dữ liệu chính xác và không bận tâm kiểm tra. (chỉ là một url được chuyển tới trình duyệt của khóa học.)

Trả lời

12

Cũng như những gì các áp phích khác đã nói, kết quả của file_exists() được tự động lưu vào bộ nhớ cache bằng PHP để cải thiện hiệu suất.

Tuy nhiên, nếu bạn đã đọc thông tin người dùng từ cơ sở dữ liệu, bạn cũng có thể lưu trữ thông tin trong đó. Nếu người dùng chỉ được phép một hình đại diện, bạn chỉ có thể lưu trữ một bit trong cột cho "có hình đại diện" (1/0) và sau đó có tên tệp giống với id người dùng và sử dụng một cái gì đó như SELECT CONCAT(IF(has_avatar, id, 'default'), '.png') AS avatar FROM users

Bạn cũng có thể xem xét lưu trữ hình ảnh thực tế trong cơ sở dữ liệu dưới dạng BLOB. Đặt nó vào bảng riêng của nó thay vì gắn nó như một cột vào bảng người dùng. Điều này có lợi ích mà nó làm cho diễn đàn của bạn rất dễ dàng để sao lưu - bạn chỉ cần xuất cơ sở dữ liệu.

+0

Thông tin bộ nhớ cache rất yên tâm, tôi đã kết thúc với giải pháp file_exists. Tuy nhiên, ý tưởng BLOB trông rất thú vị, tôi có thể thử lại sau này. Cảm ơn! –

+6

nhưng BLOB không tốt cho hiệu suất. Bạn nhận được trên không của chạy PHP, MySQL, và bạn sẽ phải viết hỗ trợ cho xác nhận bộ nhớ cache HTTP, nếu không trình duyệt sẽ không cần thiết giữ lại tải về avatar. – Kornel

+4

Điều quan trọng cần lưu ý là PHP sẽ chỉ lưu lại kết quả của các tệp tồn tại, nó sẽ không lưu trữ kết quả của các tệp không tồn tại. Xem: http://www.php.net/manual/en/function.clearstatcache.php – Brian

7

Vì máy chủ web của bạn đã thực hiện rất nhiều thao tác (file tương đương) file_exists() trong quá trình hiển thị trang web của bạn, một chạy bởi kịch bản của bạn có lẽ sẽ không có tác động có thể đo lường được. Các máy chủ web có thể sẽ làm ít nhất:

  • một cho mỗi thư mục con của thư mục gốc web (để kiểm tra sự tồn tại và cho symlink)
  • một để kiểm tra một tập tin .htaccess cho mỗi thư mục con của thư mục gốc web
  • một cho sự tồn tại của tập lệnh của bạn

Đây không phải là việc xem xét nhiều hơn mà PHP có thể tự làm.

0

tệp_exists() không chậm. Vấn đề thực sự là làm thế nào hệ thống của bạn được cấu hình và nơi mà các tắc nghẽn hiệu suất được. Hãy nhớ rằng, cơ sở dữ liệu cũng phải lưu trữ mọi thứ trên đĩa, do đó bạn có thể phải đối mặt với hoạt động của đĩa. Mặt khác, cả cơ sở dữ liệu và hệ thống tệp thường có một số dạng bộ nhớ đệm trong suốt để truy cập lặp lại tối ưu.

Bạn có thể dễ dàng đi theo một trong hai cách, vì cơ hội là nút cổ chai hiệu suất của bạn sẽ ở nơi khác. Nơi duy nhất mà tôi có thể thấy nó là một lựa chọn hiển nhiên sẽ là nếu bạn đang ở trên một loại lưu trữ được chia sẻ quá nhiều nơi có nhiều tranh chấp, nhưng có thể truy cập cơ sở dữ liệu trên một cụm riêng biệt và nhanh hơn (hoặc ngược lại).

0

Trước đây tôi đã lưu trữ siêu dữ liệu hình ảnh trong cơ sở dữ liệu (bao gồm tên của nó) để chúng tôi có thể tạo thống kê hữu ích. Quan trọng hơn, lưu trữ dữ liệu hình ảnh (không phải tập tin, chỉ siêu dữ liệu) là có lợi cho việc thay đổi. Điều gì sẽ xảy ra nếu trong tương lai bạn cần "phê duyệt" hình ảnh hoặc bạn muốn xóa hình ảnh mà không xóa tệp?

Theo hình đại diện "mặc định" ... tốt nếu không tìm thấy bản ghi cho người dùng đó, chỉ cần sử dụng hình mặc định.

Dù bằng cách nào, file_exists() hoặc db, nó không phải là một nút cổ chai đáng lo ngại. Tuy nhiên, một giải pháp có thể mở rộng hơn nhiều.

+0

Bạn đã bị bỏ phiếu và tôi không chắc chắn tại sao, đây là câu trả lời hay và tôi chưa bao giờ nghĩ về nó. –

+0

Tôi đã thông qua một số người theo dõi mà downvote tất cả mọi thứ tôi làm. –

+0

Tôi không thể nhận xét trong câu trả lời đúng, nhưng một điều nữa - KHÔNG CẦN HÌNH ẢNH NHƯ BLOBS. Đó là hiệu suất thực sự kém.Tin tôi đi, nó đã được thảo luận về quảng cáo trên toàn bộ web. –

0

Nếu hiệu suất là chỉ xem xét của bạn một file_exists() sẽ ít tốn kém hơn nhiều sau đó tra cứu cơ sở dữ liệu.

Sau khi tất cả điều này chỉ là tra cứu thư mục bằng cách sử dụng cuộc gọi hệ thống. Sau khi thực thi đầu tiên của hầu hết các thư mục có liên quan sẽ được lưu trữ trong bộ nhớ, do đó, có rất ít thực tế I/O tham gia, và, "file_exists()" là một hoạt động phổ biến mà nó và các cuộc gọi hệ thống cơ bản sẽ được đánh giá cao được tối ưu hóa trên bất kỳ kết hợp php/os phổ biến nào.

Như John II lưu ý. Nếu tính năng bổ sung và các tính năng inteface của người dùng là ưu tiên thì cơ sở dữ liệu sẽ là cách để đi.

8

Trong thử nghiệm hiệu suất thực tế, bạn sẽ khám phá file_exists rất nhanh. Vì nó là, trong php, khi cùng một url là "stat" d hai lần, cuộc gọi thứ hai chỉ là kéo từ bộ nhớ cache stat nội bộ của php.

Và đó chỉ là trong phạm vi chạy php. Ngay cả giữa các lần chạy, hệ thống tập tin/os sẽ có xu hướng đưa tập tin vào bộ đệm hệ thống tập tin một cách mạnh mẽ, và nếu tệp đủ nhỏ, không chỉ tệp kiểm tra tồn tại sẽ thoát ra khỏi bộ nhớ, mà toàn bộ tệp sẽ quá.

Dưới đây là một số dữ liệu thực tế để ủng hộ lý thuyết của tôi:

tôi chỉ làm một số xét nghiệm thực hiện các tiện ích dòng lệnh Linux "tìm" và "xargs". Trong số tiền thu được, tôi thực hiện một bài kiểm tra tồn tại trên 13000 tệp, 100 lần mỗi lần, trong dưới 30 giây, do đó, trung bình 43.000 lần kiểm tra stat mỗi giây, vì vậy chắc chắn, trên thang điểm của nó chậm nếu bạn so sánh nó để nói, thời gian nó cần để chia 9 cho 8, nhưng trong một kịch bản thế giới thực, bạn sẽ cần phải làm điều này một lần nữa là khủng khiếp để xem một vấn đề hiệu suất đáng chú ý.

Nếu bạn có 43 nghìn người dùng đồng thời truy cập trang của bạn, trong khoảng thời gian một giây, tôi nghĩ bạn sẽ có nhiều mối quan tâm lớn hơn thời gian cần để sao chép trạng thái của tệp tồn tại -hoặc ít bộ nhớ hơn đối với kịch bản trung bình.

1

Ít nhất với PHP4, tôi nhận thấy rằng một cuộc gọi đến một file_exists chắc chắn đã giết chết ứng dụng của chúng tôi - nó đã được thực hiện rất sâu trong thư viện, vì vậy chúng tôi thực sự phải sử dụng một profiler để tìm nó. Việc loại bỏ các cuộc gọi tăng tính toán của một số trang một chục lần (các cuộc gọi đã được thực hiện verrry repetidly).

Có thể là trong PHP5 chúng lưu trữ tệp tin_exists, nhưng ít nhất với PHP4 không phải như vậy.

Bây giờ, nếu bạn không ở trong vòng lặp, rõ ràng, tệp_exists sẽ không phải là vấn đề lớn.

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