2011-10-25 7 views
10

Việc sử dụng các tệp include là rất phổ biến. Tôi nghĩ rằng nó bị lạm dụng để giữ cho các mã gọn gàng mà không xem xét hiệu suất. Đối với một số include s, đĩa nên đọc các tệp và vì chúng tôi cực kỳ sử dụng đĩa, nó có thể là một quá trình chậm. Tuy nhiên, đây không phải là quá trình chậm chính hoặc quá trình giới hạn tốc độ, khi tải tệp tin với file_get_contents nhanh hơn vài lần.Đọc có bao gồm các tập tin làm chậm tải tập lệnh php không?

Tôi nghĩ rằng đây là lý do khiến các trang web lớn đặt javascripts trong tệp html thay vì tải chúng theo tệp. Ngoài ra, bạn có thể chia nhỏ một tệp JS lớn thành nhiều tệp JS nhỏ, vì các yêu cầu http song song có thể tải toàn bộ các mã JS nhanh hơn. Nhưng điều này khác với các tệp php, vì tập lệnh php đọc từng tệp một lần trong một quá trình.

  1. Vui lòng nhận xét mức độ nghiêm trọng của vấn đề này? Hãy tưởng tượng một trang web được tải ở mức 0,60, có thể include trong số 10 tệp php biến nó thành 0,70 giây không?

  2. Mặc dù hiệu ứng này không đáng kể, tôi muốn biết liệu có cách tiếp cận nào để tăng tốc quá trình này hay không. Tôi không có nghĩa là bộ đệm ẩn php như APC.

P.S. Câu hỏi này không dành cho ứng dụng thực tế (trường hợp điển hình), nhưng xét về mặt lý thuyết nói chung.

+0

Sử dụng 'include' phải cực kỳ nhanh và thậm chí nhanh hơn nếu bạn bật APC. Bạn đang đuổi theo cái đầu sai ở đây. – Petah

+0

Ngoài ra, yêu cầu song song thường chậm hơn do phí xử lý kết nối. Chỉ cần kết hợp tất cả các tệp JS và đặt chúng vào thư mục gốc của tài liệu của bạn, sau đó để máy chủ web của bạn (Apache) xử lý bộ nhớ đệm. – Petah

+0

Nó có thể rất nghiêm trọng ... nếu bạn đang sử dụng máy từ 70's: p Làm thế nào "nhanh" bạn có cần mã PHP để chạy? 0.1s có quan trọng không? Làm thế nào xấu là nó so với kiến ​​trúc tái sử dụng cao, linh hoạt và mở rộng? – LeleDumbo

Trả lời

15

include và ilk của nó là điều cần thiết. Nó tương tự như import trong Java và python ở chỗ nó được sử dụng cho các định nghĩa lớp và chức năng. include nên cực kỳ nhanh, nhưng việc sử dụng nó sẽ trì hoãn việc thực thi tập lệnh so với nếu nó không có ở đó. include hoàn toàn khác với file_get_contents(). Sau này là một hàm chứ không phải là một cấu trúc và trả về một chuỗi. include thực sự sẽ thực thi mã của tệp được bao gồm.

Tuyên bố của bạn về việc tách các tệp JS không chính xác khi tải xuống tập lệnh từ cùng một khối miền tải xuống song song và thường được đề xuất có ít nhất bao gồm cả có thể nói chung.

Tôi rất nghi ngờ rằng có nhiều include s, giả sử tất cả đều cần thiết, sẽ làm chậm hiệu suất trang của bạn. Nếu bạn gặp sự cố về hiệu suất, hãy tìm ở nơi khác.

Nếu bạn muốn tăng tốc độ php, hãy xem xét sử dụng trình biên dịch php.

+0

Cảm ơn câu trả lời thông tin của bạn. Tôi biết sự khác biệt của include và file_get_contents. Bằng cách so sánh đó, tôi có nghĩa là đọc tập tin từ đĩa có thể nhanh hơn; sau đó, bước giới hạn tốc độ là xử lý php bao gồm. – Googlebot

+1

+1 để trích dẫn trình biên dịch php. Tôi đã luôn luôn nghi ngờ về trình biên dịch php (do ý kiến ​​đối diện). Bây giờ tôi phải thử nó :) – Googlebot

4

PHP phải phân tích mã bất kể nó có nằm trong tệp php chính hay không. Đặt nó trong một bao gồm có thể làm cho không có sự khác biệt. Tốc độ đĩa không có sự khác biệt vì nó sẽ được lưu trong bộ nhớ cache sau lần đầu tiên.

+0

Điểm rất tốt. Làm thế nào là nó được lưu trữ? bởi APC? – Googlebot

+0

Không, tệp được lưu trữ bởi hệ điều hành (chỉ là bộ đệm đĩa thông thường, các tệp PHP phù hợp với nó rất dễ dàng). APC sẽ lưu lại kết quả phân tích cú pháp tệp. – Ariel

6

Có, có. Các thư viện mà bạn sử dụng để sử dụng sẽ mang lại hiệu suất phạt do rất nhiều bao gồm bên dưới. Cách tiếp cận tốt nhất để cải thiện hiệu suất là:

  1. Tập hợp lại tất cả các file có trong một
  2. Sử dụng gia tốc đơn

Nó có thể tăng tốc độ giải pháp của bạn bằng 22 lần.Read more Here

5

Hãy xem xét điều này:

(index.php) 
for ($i=0; $i<100000; $i++) { 
    include('somefile.php'); 
} 

(somefile.php) 
<?php 
// nothing here 

index.php mất ~ 115 giây (đối với tôi) để xử lý 100.000 lặp trong khi bao gồm somefile.php, mặc dù somefile.php không có gì trong đó.

Tuy nhiên:

(index.php) 
for ($i=0; $i<100000; $i++) { 
    // no file included this time 
} 

index.php giờ đây chỉ mất 0,002 giây để hoàn thành mà không có một bao gồm() xây dựng.

(index.php) 
for ($i=0; $i<100000; $i++) { 
    echo $i .'<br/>'; 
} 

index.php mất 0,02 giây để lặp lại 100.000 lần lặp lại $ i. Tất nhiên, đây là một ví dụ khá khắc nghiệt do số lần lặp lại lớn, nhưng nó cho thấy rằng chỉ cần bao gồm một cấu trúc bao gồm, thời gian thực thi kịch bản có thể bị trì hoãn khá theo cấp số nhân. Hãy xem xét điều này trong lần sau khi bạn viết một quy trình với số lượng lớn các lần lặp lại, ví dụ: đọc/ghi các tệp XML lớn, v.v. Tốt nhất là giữ mã của bạn nội tuyến, ngay cả khi điều đó có nghĩa là nó ít quản lý hơn. Nguyên nhân không chỉ là bạn thêm ~ 115 giây (~ 2 phút) vào thời gian thực thi kịch bản ở mỗi 100.000 lần lặp lại đơn giản bằng cách bao gồm một hàm include(), nhưng hãy xem xét nếu có() (somefile.php) có các quy trình của riêng nó thi hành. Ví dụ của tôi chỉ đơn giản là thêm một bao gồm() xây dựng .. các tập tin bao gồm không có gì.

Bây giờ, bao gồm các tệp ở đây và ở đó cho trang web, thời gian sẽ không đáng kể. Tôi chỉ chỉ ra rằng cấu trúc include() không yêu cầu xử lý thêm bất kể nội dung của nó.