2009-08-01 37 views
5

Tôi thường bao gồm 1 tệp chức năng vào ứng dụng của trang web của tôi, hiện tại trang web này có lưu lượng truy cập khá cao và tôi chỉ muốn làm mọi điều tốt nhất có thể, vì vậy câu hỏi của tôi ở đây là,Hiệu suất nào tốt hơn trong PHP?

Có tốt hơn không để bao gồm nhiều tệp loại hàm nhỏ hơn chỉ với mã cần thiết cho trang đó hoặc thực sự không có sự khác biệt khi tải tất cả dưới dạng 1 tệp lớn, tệp chức năng hiện tại của tôi có tất cả các chức năng cho toàn bộ trang web của tôi, khoảng 4.000 dòng dài và được tải trên mỗi trang tải trang web, điều đó có tệ không?

Trả lời

5

Thật khó để nói. 4.000 dòng không phải là lớn trong các cõi phân tích tệp. Về mặt quản lý mã, điều đó bắt đầu ở bên khó sử dụng nhưng bạn không thể thấy nhiều sự khác biệt về hiệu suất có thể đo lường bằng cách chia nhỏ thành 2, 5 hoặc 10 tệp và các trang chỉ bao gồm vài trang mà họ cần (thực hành mã hóa tốt hơn, nhưng đó là một vấn đề riêng). Sự khác biệt của bạn về số lượng dòng đọc so với số lượng tệp mà trình phân tích cú pháp cần mở không có vẻ đủ lớn để đảm bảo bất kỳ điều gì đáng kể. Phản ứng ban đầu của tôi là điều này có lẽ không phải là vấn đề bạn cần phải lo lắng.

Ở phía đối diện của đồng xu, tôi đã làm việc trên một dự án cấp doanh nghiệp, nơi một số hoạt động có một cây include() thường mở rộng thành hàng trăm tệp. Việc lập hồ sơ các hoạt động này chỉ ra rằng thời gian thực hiện bởi các cuộc gọi include() một mình được tạo thành từ 2-3 giây của một hoạt động tải 10 giây (đây là PHP4).

+1

Hãy nhớ rằng, những dòng 4k đó sẽ được phân tích cú pháp và chạy để truy cập trang _every_. Trừ khi bạn có một số trình tối ưu hóa chạy bộ đệm được biên dịch bytecode, nhưng cuối cùng tôi đã xem những thứ đó có chi phí và vì vậy thường không được cài đặt trừ khi bạn trả tiền cho nó. – Joey

+1

Vâng, đó là sự thật. Nhưng cũng có một chi phí cho đĩa tìm kiếm để đối phó với nhiều tập tin. Nếu bạn cho rằng anh ta chia nó thành 10 tệp 400 dòng, và trung bình anh ta bao gồm 4 tệp trong mỗi tệp, sau đó anh ấy giảm xuống 1600 dòng mã và 4 tệp. Câu hỏi đặt ra là liệu việc giảm số lượng các dòng được phân tích có lớn hơn giá trị bao gồm().Tôi đề xuất rằng sự khác biệt sẽ cực kỳ nhỏ. Cách duy nhất để chắc chắn tất nhiên là để chuẩn nó. Quả thật, nếu bạn ở cấp độ tối ưu hóa đó, bộ nhớ cache opcode sẽ là thời gian tốt hơn nhiều. – zombat

+0

ok cảm ơn các bình luận, Nếu tôi từng quyết định chia nhỏ các file nhỏ hơn, như chức năng diễn đàn, chức năng blog, vv. Vì trang web của tôi có hàng trăm trang, tất cả đều có 1 file chức năng của tôi mã mà cần phải xác định các tập tin để tải bên trong bao gồm các tập tin chức năng thay vì chỉnh sửa một loạt các tập tin phải không? Tôi biết nó sẽ không đẹp nhưng sẽ ổn chứ? – JasonDavis

1

Nói chung, tốt hơn là quản lý tệp một cách khôn ngoan, chia nhỏ các tệp thành các tệp nhỏ hơn vì bạn chỉ cần tải các tệp mà bạn thực sự sử dụng. Nhưng, tại 4.000 dòng, nó có thể sẽ không tạo ra quá nhiều sự khác biệt.

tôi muốn đề nghị một giải pháp tương tự như sau

function inc_lib($name) 
{ 
    include("/path/to/lib".$name.".lib.php"); 
} 

function inc_class($name) 
{ 
    include("/path/to/lib".$name.".class.php"); 
} 
+0

ý tưởng tốt nhờ – JasonDavis

1

Tôi nghĩ rằng nó sẽ tốt hơn nếu bạn có thể chia file chức năng lên thành các thành phần đó là phù hợp với từng trang; và gọi cho các thành phần đó trong các trang thích hợp. Chỉ cần 2 xu của tôi!

p/s: Tôi là một người nghiệp dư PHP và tôi đang cố gắng tạo một trang web PHP; Tôi không sử dụng bất kỳ chức năng nào. Vì vậy, bạn có thể khai sáng cho tôi về những chức năng nào bạn cần cho một trang web?

+0

trang web php.net có tất cả các chức năng php gốc, tuy nhiên bạn có thể tạo mã thực hiện các chức năng/nhiệm vụ nhất định và đặt nó vào chức năng của riêng bạn, có thể gọi lại nhiều lần, vì vậy bạn không Không phải viết e-block cùng một khối mã một trăm lần – JasonDavis

1

Trong kinh nghiệm của tôi có một tệp bao gồm lớn được bao gồm ở khắp mọi nơi thực sự có thể giết hiệu suất. Tôi đã làm việc trên một trò chơi trình duyệt, nơi chúng tôi đã có tất cả các quy tắc trò chơi như PHP được tạo động (trong số những người khác) và tệp nặng khoảng 500 KiB. Nó chắc chắn ảnh hưởng đến hiệu suất và chúng tôi xem xét việc tạo ra một phần mở rộng PHP để thay thế.

Tuy nhiên, như thường lệ, tôi muốn nói bạn nên làm những gì bạn đang làm bây giờ cho đến khi đó là vấn đề hiệu suất và sau đó tối ưu hóa khi cần.

3

Nếu bạn có thể cài đặt tiện ích trên máy chủ của mình, bạn nên xem APC (see also).
Hoàn toàn miễn phí ;-); nhưng bạn phải là quản trị viên của máy chủ của bạn để cài đặt nó; vì vậy thường không được cung cấp trên shared hosting ...

Nó được gọi là "bộ nhớ cache opcode".

Về cơ bản, khi một kịch bản PHP được gọi là, có hai điều xảy ra:

  • kịch bản được "biên soạn" vào opcodes
  • opcodes được thực hiện

APC giữ opcodes trong RAM ; do đó, các tập tin không phải được tái biên dịch mỗi khi nó được gọi là - và đó là một điều tuyệt vời cho cả CPU-tải và biểu diễn.


Để trả lời câu hỏi nhiều hơn một chút:

  • 4.000 dòng không phải là nhiều, nói về màn trình diễn; Mở một vài tệp của bất kỳ ứng dụng/khung lớn nào và bạn sẽ nhanh chóng nhận được một vài nghìn dòng
  • a điều thực sự quan trọng điều cần tính đến là khả năng duy trì: điều gì sẽ dễ dàng hơn cho bạn và đội bạn ?
  • tải nhiều tệp nhỏ có thể hàm ý nhiều cuộc gọi hệ thống, quá chậm; nhưng có thể không được lưu giữ bởi hệ điều hành ... Vì vậy, có lẽ không phải rằng có liên quan
  • Nếu bạn đang thực hiện truy vấn cơ sở dữ liệu 1, (bao gồm cả vòng khứ hồi giữa máy chủ PHP và máy chủ DB) mất nhiều thời gian hơn việc phân tích cú pháp của một vài nghìn dòng ;-)
1

Nếu bạn tải một tệp dòng 4000 và sử dụng 1 hàm có 10 dòng, thì có, tôi cho rằng nó không hiệu quả. Ngay cả khi bạn sử dụng rất nhiều chức năng của 1000 dòng kết hợp, nó vẫn không hiệu quả.

Đề xuất của tôi sẽ là nhóm các chức năng liên quan với nhau và lưu trữ chúng trong các tệp riêng biệt. Bằng cách đó, nếu một trang chỉ đề cập đến, ví dụ, các hàm cơ sở dữ liệu, bạn có thể tải chỉ các tệp/thư viện hàm cơ sở dữ liệu của bạn.

Lý do an toàn để tách các chức năng là bảo trì. Nếu bạn cần thay đổi một chức năng bạn cần tìm nó trong tập tin nguyên sơ của bạn bao gồm. Bạn cũng có thể có các chức năng rất, rất giống nhau nhưng thậm chí không nhận ra nó. Sắp xếp các hàm theo những gì chúng làm cho phép bạn so sánh chúng và loại bỏ những thứ bạn không cần hoặc hợp nhất hai hàm thành một hàm mục đích chung khác.

+0

điểm tốt nhờ – JasonDavis

1

Phần lớn thời gian Đĩa IO là những gì sẽ giết máy chủ của bạn vì vậy tôi nghĩ rằng các tệp nhỏ hơn bạn tìm nạp từ đĩa càng tốt. Hơn nữa nếu có thể cài đặt APC thì tệp sẽ được lưu trữ được biên dịch thành bộ nhớ, đó là một chiến thắng lớn.

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