2010-02-19 26 views
36

Câu hỏi PHP không có kinh nghiệm:PHP bao gồm(): Kích thước và hiệu suất tệp

Tôi có tệp tập lệnh PHP mà tôi cần đưa vào nhiều trang khác nhau ở nhiều nơi.

Tôi có tùy chọn tách tệp được đưa vào một số tệp nhỏ hơn và bao gồm những tệp này theo cơ sở cần thiết ... HOẶC ... Tôi có thể giữ tất cả lại với nhau trong một tệp PHP duy nhất.

Tôi tự hỏi liệu có bất kỳ tác động hiệu suất nào khi sử dụng tệp lớn hơn so với tệp nhỏ hơn cho include() trong ngữ cảnh này không? Ví dụ: có bất kỳ sự khác biệt hiệu suất nào giữa tệp 200KB và tệp 20KB không?

Cảm ơn bạn.

Trả lời

43

Sẽ có sự khác biệt, giữa tệp 200KB và 20KB ... Nhưng có thể bạn sẽ không nhận thấy: tệp 200KB không lớn lắm - và bạn thường sử dụng nhiều tệp không phải là "nhỏ ", khi bạn đang xây dựng một ứng dụng lớn.

Có hai điều mà mất thời gian, khi bạn đang tải một file .php:

  • Mã nguồn PHP được "biên soạn" thành "opcodes" - đó là khá tương đương với JAVA bytecode
    • này được thực hiện mỗi lần một file PHP được bao gồm, theo mặc định
    • Nhưng, sử dụng một số bộ nhớ cache opcode như APC, những opcodes có thể được giữ trong bộ nhớ, và các công cụ biên soạn này không được thực hiện mỗi lần một nymore - rất tuyệt: nó sẽ có nghĩa là ít CPU được sử dụng hơn, vì việc biên dịch sẽ không được thực hiện nữa (nó sẽ chỉ được thực hiện một lần trong một thời gian).
  • Các opcodes được thực hiện
    • Tùy thuộc vào những gì bạn kịch bản chứa, điều này có thể mất một thời gian, hoặc không:
    • Nếu tập tin chỉ chứa các chức năng hoặc các lớp học định nghĩa, điều này sẽ không mất nhiều thời gian : không có gì sẽ được thực hiện.
    • Nếu tập tin chứa các hướng dẫn, nó sẽ mất nhiều thời gian ^^


Là một sidnote: trong một tình hình chung, bạn sẽ đạt được rất nhiều thời gian/cpu/nguồn lực tối ưu hóa các truy vấn SQL của bạn, hoặc thêm một số tính năng thuần hóa bộ nhớ đệm, hơn là nghĩ về loại công cụ đó.

+0

Cảm ơn bạn đã giải thích thêm. – Tom

+0

Bạn được chào đón :-) Hãy vui vẻ! –

+2

Ngay cả với APC, hãy xem xét sử dụng hàm __autoload tùy chỉnh/spl_autoload_register - Tôi chỉ có thể bao gồm các tệp mô hình trong khung MVC tùy chỉnh trong đó lớp được gọi thay vì một trang tính bao gồm tất cả các tệp mô hình. . Vì vậy, nếu một trang render là 80 ms và bạn có thể tiết kiệm 20 ms thông qua chỉ bao gồm những gì bạn cần ngay cả với APC (khi có nhiều bao gồm), nó có thể đáng làm. Cũng chỉ mất 10 phút để thực hiện. – codercake

1

Chắc chắn có tác động, vì vậy hãy nhớ sử dụng include_once() thay vì include(). Bạn có thể xem xét sử dụng APC có bộ đệm ẩn.

+0

ggiroux ... cảm ơn ... điều gì sẽ xảy ra khi tệp được lưu trong bộ nhớ cache? Trừ khi đó là một câu hỏi thực sự ngớ ngẩn. – Tom

+1

nếu nó được lưu trữ, tôi sẽ nói rằng tác động là rất tối thiểu, vì nó sẽ được lưu trữ trong bytecode biên dịch sẵn trong bộ nhớ chia sẻ. – ggiroux

+3

include_once() thay vì bao gồm()? Hãy mở rộng trên đó; nó chắc chắn không thêm vào tốc độ để sử dụng include_once vì những lý do đã được đề cập trong luồng này rồi. – Slavic

16

Hãy cẩn thận với include_once() (và cũng là require_once()), chạy đắt hơn include(). Mỗi lần include_once() được chạy, PHP thực hiện tra cứu dựa vào chỉ mục nội bộ của các tệp đã được bao gồm trước khi quyết định có tải tệp hay không. Càng bao gồm trong chỉ mục, việc tìm kiếm này càng chậm. Ngoài ra khi sử dụng include() hoặc include_once() hãy thử sử dụng đường dẫn tuyệt đối nếu có thể vì điều này nhanh hơn nhiều so với đường dẫn tương đối vì bạn không buộc PHP phải tìm ra đường dẫn tuyệt đối cho bạn. Như ggiroux đã nói, một số hình thức đệm như APC sẽ gặt hái những phần thưởng lớn và khiến bạn lo lắng về số lượng cuộc gọi bạn có liên quan (phần lớn) (trừ khi bạn có một số mã kém).

EDIT--

lo lắng về các cuộc gọi trên chỉ là một vấn đề khi bạn bắt đầu có vài ngàn requires hoặc includes trong codebase của bạn.

+0

Trên web, cứ 100 ms đếm được. Bạn không cần hàng ngàn bao gồm để hưởng lợi từ điều này cực kỳ. – Pacerier

+0

Bạn nghĩ gì về bài đăng lạ này: https://seeit.org/2010/06/11/php-the-include-include_once-performance-debate/ tuyên bố rằng ** include_once() ** thực sự nhanh hơn sau đó ** bao gồm() **? – Adam

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