2012-07-13 37 views
16

Để cung cấp một số ngữ cảnh:Cách sử dụng bộ nhớ apache PHP thực sự hoạt động như thế nào?

Tôi đã thảo luận với một đồng nghiệp gần đây về việc sử dụng Tự động tải trong PHP. Tôi đã tranh luận ủng hộ họ, anh ta chống lại.

Quan điểm của tôi là Trình nạp tự động có thể giúp bạn giảm thiểu sự phụ thuộc nguồn thủ công, do đó có thể giúp bạn giảm lượng bộ nhớ được tiêu thụ khi bao gồm nhiều tệp lớn mà bạn có thể không cần.

Câu trả lời của ông là bao gồm các tệp mà bạn không cần không phải là vấn đề lớn bởi vì sau khi tệp được đưa vào khi nó được lưu trong bộ nhớ của tiến trình con Apache và phần bộ nhớ này sẽ có sẵn cho các yêu cầu tiếp theo. Ông lập luận rằng bạn không nên quan tâm về số lượng các tập tin được bao gồm bởi vì đủ sớm tất cả chúng sẽ được nạp vào bộ nhớ và sử dụng theo yêu cầu từ bộ nhớ. Do đó bộ nhớ là ít hơn của một vấn đề và chi phí của cố gắng để tìm tập tin bạn cần trên hệ thống tập tin là nhiều hơn nữa của một mối quan tâm.

Anh ấy là một người thông minh và có xu hướng biết những gì anh ấy đang nói. Tuy nhiên, tôi luôn nghĩ rằng bộ nhớ được sử dụng bởi Apache và PHP là đặc thù cho yêu cầu cụ thể đó được xử lý. Mỗi yêu cầu được chỉ định một lượng bộ nhớ bằng với tùy chọn bộ nhớ PHP_limit và bất kỳ quá trình biên soạn và xử lý nguồn nào chỉ hợp lệ cho tuổi thọ của yêu cầu.

Ngay cả với bộ đệm mã hóa như APC, tôi cho rằng yêu cầu riêng lẻ vẫn cần tải từng tệp trong phần bộ nhớ riêng của nó và APC chỉ là một phím tắt để nó được biên dịch trước cho quá trình phản hồi .

Tôi đã tìm kiếm một số tài liệu về điều này nhưng chưa quản lý để tìm bất kỳ nội dung nào cho đến thời điểm này. Tôi thực sự sẽ đánh giá cao nếu ai đó có thể chỉ cho tôi bất kỳ tài liệu hữu ích về chủ đề này.

UPDATE:

Chỉ cần làm rõ, phần thảo luận autoloader là nhiều hơn một bối cảnh :).

Có thể không rõ ràng nhưng câu hỏi chính của tôi là về việc Apache sẽ gộp lại các tài nguyên của nó để trả lời nhiều yêu cầu (đặc biệt là bộ nhớ được sử dụng bởi các tệp được bao gồm) hoặc liệu mỗi yêu cầu có cần lấy lại mã được yêu cầu không đường dẫn thực hiện tách biệt với các yêu cầu khác được xử lý từ cùng một quá trình.

ví dụ: Tệp 1, 2, 3 và 4 có kích thước bằng nhau là 100KB. Yêu cầu A bao gồm tệp 1, 2 và 3. Yêu cầu B bao gồm tệp 1, 2, 3 và 4.

Trong suy nghĩ của mình, yêu cầu A sẽ tiêu thụ 300KB cho toàn bộ quá trình thực hiện và Yêu cầu B sẽ chỉ tiêu thụ thêm 100KB vì các tệp 1,2 và 3 đã có trong bộ nhớ.

Trong tâm trí của tôi là 300KB và 400KB vì chúng đều được xử lý độc lập (nếu theo cùng một quy trình).

Điều này đưa anh ta trở lại lập luận của mình rằng "chỉ cần bao gồm nhiều 'cos bạn sẽ sử dụng nó" như trái ngược với tôi "chỉ bao gồm những gì bạn cần để giữ cho kích thước yêu cầu xuống".

Điều này khá cơ bản đối với cách tôi tiếp cận xây dựng một trang web PHP, vì vậy tôi rất muốn biết liệu tôi có bị đánh dấu ở đây hay không.

Tôi cũng luôn tin tưởng rằng đối với bộ nhớ trang web quy mô lớn là tài nguyên quý giá nhất và quan tâm nhiều hơn kiểm tra hệ thống tệp cho trình tải tự động có thể được hạt nhân lưu trong bộ nhớ cache.

Bạn nói đúng, đã đến lúc chuẩn bị!

Trả lời

2

Bạn là ninja khôn ngoan, châu chấu.

Trình nạp tự động không tải tệp lớp cho đến khi lớp được yêu cầu. Điều này có nghĩa là họ sẽ sử dụng tối đa cùng một lượng bộ nhớ như hướng dẫn bao gồm, nhưng thường ít hơn nhiều.

Lớp học được đọc mới từ mỗi yêu cầu tập tin ngay cả khi chuỗi apache có thể xử lý nhiều yêu cầu, do đó, tất cả các sự kiện bạn bè của bạn đều được đọc 'không chứa nước.

Bạn có thể chứng minh điều này bằng cách đặt một tiếng vọng 'foo'; trên định nghĩa lớp trong tệp lớp. Bạn sẽ thấy trên mỗi yêu cầu mới, dòng sẽ được thực hiện bất kể bạn tự động tải hay bao gồm toàn bộ thế giới của các tệp lớp lúc bắt đầu.

Tôi không thể tìm thấy bất kỳ tài liệu ngắn gọn nào về điều này - tôi có thể viết một số bằng một số ví dụ về sử dụng bộ nhớ - vì tôi cũng phải giải thích điều này cho người khác và hiển thị bằng chứng để nó chìm vào. những người ở zend đã không nghĩ rằng bất cứ ai sẽ không nhìn thấy lợi ích của autoloading. Có, apc và như vậy (giống như tất cả các giải pháp lưu trữ) có thể vượt qua các âm bản resouce và thậm chí eek ra lợi ích nhỏ trong hiệu suất, nhưng bạn ăn lên rất nhiều bộ nhớ không cần thiết nếu bạn làm điều này trên một số lượng không nhỏ của thư viện và phục vụ một số lượng lớn khách hàng. Hãy thử một cái gì đó Giống như tải một đoạn lành mạnh của các thư viện quả lê trong một tập tin bao gồm lớn trong khi xử lý 500 kết nối đánh trang của bạn cùng một lúc.

Ngay cả khi sử dụng những thứ như Apc, bạn có thể sử dụng tự động nạp với bất kỳ lớp không có tên nào (hầu hết mã php hiện có) vì nó có thể giúp tránh ô nhiễm không gian tên toàn cầu khi xử lý các thư viện lớp lớn.

4

Dưới đây là cách bạn giành được đối số: chạy điểm chuẩn thực tế và ở bên phải các số.

Tôi đã có cùng một cuộc thảo luận này, vì vậy tôi đã thử một thử nghiệm. Sử dụng APC, tôi đã thử một ứng dụng Kohana với một nguyên khối duy nhất bao gồm (chứa tất cả Kohana) cũng như với bộ nạp tự động tiêu chuẩn. Kết quả cuối cùng là single bao gồm nhanh hơn với tốc độ không liên quan thống kê (dưới 1%) nhưng sử dụng nhiều bộ nhớ hơn (theo các chức năng bộ nhớ của PHP). Chạy thử nghiệm mà không có APC (hoặc XCache, vv) là vô nghĩa, vì vậy tôi không bận tâm.

Vì vậy, kết luận của tôi là tiếp tục sử dụng tính năng tự động tải vì nó đơn giản hơn nhiều để sử dụng. Hãy thử điều tương tự với ứng dụng của bạn và hiển thị kết quả cho bạn bè của bạn.

Bây giờ bạn không cần phải đoán.

Tuyên bố từ chối trách nhiệm: Tôi không sử dụng Apache. Tôi không thể nhấn mạnh đủ để chạy điểm chuẩn của riêng bạn trên phần cứng của riêng bạn trên ứng dụng của riêng bạn. Đừng tin rằng kinh nghiệm của tôi sẽ là của bạn.

+0

Cảm ơn Matthew, tôi đã chỉnh sửa bài đăng gốc chỉ trong trường hợp giúp, nhưng tôi chắc chắn sẽ chạy một số bài kiểm tra! – Sirhara

+0

Tôi không chắc chắn cách mod_php xử lý phục vụ cùng một trang, nhưng nếu bạn sử dụng bộ nhớ cache opcode, thì các tệp PHP sẽ tự động nằm trong bộ nhớ dùng chung. Cách tôi hiểu vani PHP, là trên mỗi yêu cầu tập tin được mở, phân tích cú pháp, và thực hiện ... vì vậy tôi không chắc chắn nơi chia sẻ bộ nhớ sẽ xảy ra. Tôi nghĩ rằng nó vẫn đi xuống để điểm chuẩn ... sử dụng một cái gì đó như 'ab' để chạy thử nghiệm. Tôi chắc rằng bạn sẽ thấy rằng có hay không bạn sử dụng Tự động tải xuống tùy theo sở thích cá nhân ... Tôi không nghĩ hiệu suất sẽ khác biệt đáng kể. – Matthew

0

Đây là opionion của tôi.

Tôi nghĩ autoloaders là một ý tưởng rất xấu vì những lý do sau đây

  1. Tôi muốn biết những gì và ở đâu kịch bản của tôi được lấy dữ liệu/code từ.Giúp gỡ lỗi dễ dàng hơn.
  2. Điều này cũng có vấn đề về cấu hình cho đến khi một trong những nhà phát triển của bạn thay đổi tệp (nâng cấp vv) hoặc cấu hình và mọi thứ ngừng hoạt động thì khó tìm ra nơi bị hỏng.
  3. Tôi cũng nghĩ rằng đó là lập trình lười biếng.

Đối với bộ nhớ/vấn đề tiền phôi, nó cũng rẻ để mua thêm bộ nhớ cho máy tính nếu nó gặp khó khăn với điều đó.

+1

bạn có thể xây dựng một chút về lý do tại sao bạn nghĩ rằng đây là chương trình lười biếng không? Tôi tò mò vì nó có vẻ đủ hợp lý để có một chức năng tự động nạp đạn. – Dave

+1

@Dave - Tôi nghĩ rằng đó là lười biếng không được rõ ràng như những gì cấu thành kịch bản của bạn và dựa vào thông dịch viên để tìm mã thích hợp. Nó cũng giúp với các tài liệu và bảo trì trong tương lai. Tại sao rất nhiều nỗ lực để nhập vào 'require'? –

+0

@Ed nó có thể được lập luận rằng, tất cả mọi thứ là bình đẳng, một lập trình lười biếng là tốt hơn so với một trong những người làm việc chăm chỉ tất cả các thời gian –

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