Hướng dẫn does php have memory management? - php có quản lý bộ nhớ không?

Các lập trình viên C thường phải đối phó với bộ nhớ bằng tay. Với bộ nhớ động, lập trình viên phân bổ bộ nhớ khi cần và giải phóng nó khi hoàn thành. Không có bộ nhớ động tự do dẫn đến một bộ nhớ rò rỉ bộ nhớ, có thể hoặc không phải là một điều xấu. Trong trường hợp của PHP, vì quá trình này có thể sống trong một khoảng thời gian gần như vô hạn, việc tạo ra rò rỉ bộ nhớ sẽ rất ấn tượng. Trong mọi tình huống, bộ nhớ rò rỉ thực sự chuyển sang các chương trình được thiết kế kém và xấu không thể tin cậy được. Rò rỉ bộ nhớ rất dễ hiểu. Bạn yêu cầu HĐH đặt một phần bộ nhớ máy chính cho bạn, nhưng bạn không bao giờ bảo nó giải phóng lại cho các quy trình khác .

Ngoài ra, trong C, các khu vực bộ nhớ rõ ràng bị ràng buộc. Đọc hoặc viết trước hoặc sau giới hạn là một hoạt động rất khó chịu. Điều đó sẽ dẫn đến một vụ tai nạn, hoặc tệ hơn là một vấn đề bảo mật có thể khai thác. Không có những thứ kỳ diệu như khu vực tự động có thể điều khiển được với ngôn ngữ C. Bạn phải nói rõ với máy (và CPU) những gì bạn muốn nó làm. Không đoán, không có phép thuật, không tự động hóa dưới bất kỳ hình thức nào (như bộ sưu tập rác).

PHP có một mô hình bộ nhớ rất cụ thể và cung cấp lớp riêng của nó qua bộ phân bổ bộ nhớ động LIBC truyền thống. Lớp này được gọi là Trình quản lý bộ nhớ Zend.Zend Memory Manager.

Chương này giải thích cho bạn Trình quản lý bộ nhớ Zend là gì, bạn phải sử dụng nó như thế nào và những gì bạn phải/không được làm với nó. Sau đó, chúng tôi sẽ nhanh chóng giới thiệu cho bạn các công cụ cụ thể được sử dụng trong khu vực C để gỡ lỗi bộ nhớ động.

Ghi chú

Nếu bạn cần, xin vui lòng có được một số kiến ​​thức (có thể mạnh mẽ) về các lớp phân bổ bộ nhớ C (bộ nhớ tĩnh so với bộ nhớ động) và về bộ phân bổ Libc.

Contents:

  • Trình quản lý bộ nhớ Zend
    • Hai loại bộ nhớ động chính trong PHP
    • API Trình quản lý bộ nhớ Zend
    • Zend Trình quản lý bộ nhớ gỡ lỗi Shields
    • Thiết kế nội bộ Zendmm
    • Lỗi và sai lầm phổ biến
  • Bộ nhớ gỡ lỗi
    • Một lưu ý nhanh về valgrind
    • Trước khi bắt đầu
    • Ví dụ phát hiện rò rỉ bộ nhớ
    • Bộ đệm tràn/phát hiện dòng chảy
    • Kết luận

24

Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.

Quản lý bộ nhớ không phải là thứ mà hầu hết các nhà phát triển PHP cần phải suy nghĩ. Tôi đang gặp phải một vấn đề trong đó tập lệnh dòng lệnh của tôi đang hết bộ nhớ. Nó thực hiện nhiều lần lặp qua một mảng lớn các đối tượng, thực hiện nhiều yêu cầu cơ sở dữ liệu trên mỗi lần lặp. Tôi chắc chắn rằng việc tăng trần bộ nhớ có thể là một sửa chữa ngắn hạn, nhưng tôi không nghĩ đó là một giải pháp dài hạn thích hợp. Tôi nên làm gì để đảm bảo rằng tập lệnh của tôi không sử dụng quá nhiều bộ nhớ và sử dụng bộ nhớ một cách hiệu quả?

hỏi ngày 22 tháng 9 năm 2011 lúc 15:30Sep 22, 2011 at 15:30

4

Nguyên tắc vàng

Điều cần làm khi bạn gặp phải (hoặc mong đợi gặp) áp suất bộ nhớ là: Không đọc lượng dữ liệu lớn trong bộ nhớ cùng một lúc nếu bạn có ý định xử lý chúng theo tuần tự.do not read massive amounts of data in memory at once if you intend to process them sequentially.

Examples:

  • Không lấy một kết quả lớn được đặt trong bộ nhớ dưới dạng một mảng; thay vào đó, hãy lấy từng hàng lần lượt và xử lý nó trước khi tìm nạp hàng tiếp theo
  • Không đọc các tệp văn bản lớn trong bộ nhớ (ví dụ: với file); Thay vào đó, hãy đọc một dòng tại một thời điểm

Đây không phải lúc nào cũng là thứ thuận tiện nhất trong PHP (mảng không cắt nó và có rất nhiều mã chỉ hoạt động trên mảng), nhưng trong các phiên bản gần đây và đặc biệt là sau khi giới thiệu máy phát điện, việc truyền phát trực tiếp của bạn dễ dàng hơn bao giờ hết Dữ liệu thay vì chunk nó.

Thực hiện thực hành này một cách tôn giáo sẽ "tự động" chăm sóc những thứ khác cho bạn:

  • Không còn cần phải làm sạch các tài nguyên với dấu chân bộ nhớ lớn bằng cách đóng chúng và mất tất cả các tài liệu tham khảo theo mục đích, bởi vì sẽ không có tài nguyên như vậy để bắt đầu
  • Không còn cần phải giải quyết các biến lớn sau khi bạn hoàn thành chúng, bởi vì sẽ không có biến nào như vậy

Những việc khác cần làm

  • Hãy cẩn thận tạo ra đóng cửa bên trong các vòng lặp; Điều này sẽ dễ dàng thực hiện, vì việc tạo ra các vòng lặp bên trong là một mùi mã xấu. Bạn luôn có thể nâng đóng cửa lên trên và cung cấp cho nó nhiều tham số hơn.
  • Khi mong đợi đầu vào lớn, hãy thiết kế chương trình của bạn và chọn thuật toán phù hợp. Ví dụ: bạn có thể hợp nhất bất kỳ số lượng tệp văn bản nào có kích thước bằng cách sử dụng một lượng bộ nhớ không đổi.

Đã trả lời ngày 22 tháng 9 năm 2011 lúc 15:32Sep 22, 2011 at 15:32

Hướng dẫn does php have memory management? - php có quản lý bộ nhớ không?

JonjonJon

419K78 Huy hiệu vàng723 Huy hiệu bạc793 Huy hiệu Đồng78 gold badges723 silver badges793 bronze badges

0

Bạn có thể thử định lập nó khi đặt một số cuộc gọi đến memory_get_usage(), để tìm nơi mà nó đạt đến đỉnh điểm.

Tất nhiên, biết mã thực sự làm gì bạn sẽ có thêm thông tin để giảm việc sử dụng bộ nhớ.

Đã trả lời ngày 22 tháng 9 năm 2011 lúc 15:41Sep 22, 2011 at 15:41

Hướng dẫn does php have memory management? - php có quản lý bộ nhớ không?

Elias Dorneleselias DorneleElias Dorneles

21.4K11 Huy hiệu vàng81 Huy hiệu bạc103 Huy hiệu đồng11 gold badges81 silver badges103 bronze badges

Khi bạn tính toán mảng lớn các đối tượng của mình, hãy cố gắng không tính toán tất cả cùng một lúc. Đi bộ theo các bước và xử lý các yếu tố khi bạn đi bộ sau đó là bộ nhớ miễn phí và thực hiện các yếu tố tiếp theo.

Sẽ mất nhiều thời gian hơn, nhưng bạn có thể quản lý lượng bộ nhớ bạn sử dụng.

Đã trả lời ngày 22 tháng 9 năm 2011 lúc 15:37Sep 22, 2011 at 15:37

Dan Bizdadeadan BizdadeaDan Bizdadea

1.2948 huy hiệu bạc13 huy hiệu đồng8 silver badges13 bronze badges

PHP sử dụng bao nhiêu bộ nhớ?

Một phù hợp cho bạn phụ thuộc vào cấu hình hệ thống của bạn. Một giới hạn bộ nhớ thích hợp điển hình cho Drupal chạy PHP là 128MB mỗi quá trình; Đối với các trang web có rất nhiều mô-đun đóng góp hoặc với các trang bộ nhớ cao, 256MB hoặc thậm chí 512MB có thể phù hợp hơn.128MB per process; for sites with a lot of contributed modules or with high-memory pages, 256MB or even 512MB may be more appropriate.

Làm cách nào để theo dõi việc sử dụng bộ nhớ PHP?

Hàm Memory_Get_usage có thể được sử dụng để theo dõi việc sử dụng bộ nhớ.Hàm 'malloc' không được sử dụng cho mọi khối cần thiết, thay vào đó, một khối lớn bộ nhớ hệ thống được phân bổ và biến môi trường được thay đổi và quản lý nội bộ.. The 'malloc' function is not used for every block required, instead a big chunk of system memory is allocated and the environment variable is changed and managed internally.

Làm cách nào để kiểm tra giới hạn bộ nhớ PHP của tôi?

Hiển thị hoạt động trên bài đăng này ...
PHP -cli: dòng lệnh để kiểm tra ini: $ php -r "echo ini_get ('memory_limit');"Hoặc kiểm tra thông tin php -cli và grep memory_limit giá trị: $ PHP -I |grep "memory_limit".
PHP-FPM: Dán dòng này vào index.php hoặc bất kỳ tệp PHP nào có thể được xem trên trình duyệt, sau đó kiểm tra kết quả:

Giới hạn bộ nhớ PHP tối đa là gì?

Theo mặc định, tập lệnh PHP có thể phân bổ tối đa 128 megabyte bộ nhớ.Để xác minh giá trị hiện tại của Chỉ thị Memory_Limit và các chỉ thị khác, bạn có thể sử dụng hàm phpinfo ().128 megabytes of memory. To verify the current value of the memory_limit directive and other directives, you can use the phpinfo() function.