Cấu hình bộ nhớ PHP


95

Cách tốt để lập hồ sơ sử dụng bộ nhớ của trang PHP là gì? Ví dụ: để xem dữ liệu của tôi đang sử dụng bao nhiêu bộ nhớ và / hoặc lệnh gọi hàm nào đang phân bổ nhiều bộ nhớ nhất.

  • xdebug dường như không cung cấp thông tin bộ nhớ trong tính năng cấu hình của nó.

  • Xdebug không cung cấp cho nó trong tính năng truy tìm nó. Điều này khá gần với những gì tôi muốn, ngoại trừ lượng dữ liệu tuyệt đối quá tải, vì nó hiển thị các delta bộ nhớ cho mỗi lệnh gọi chức năng. Nếu có thể ẩn các cuộc gọi dưới một độ sâu nhất định, có thể với một số công cụ GUI, điều đó sẽ giải quyết được vấn đề của tôi.

Có gì khác?


Hãy xem bài nói chuyện của Rasmus Lerdorf có tên "Đơn giản là khó" ( talk.php.net/show/froscon08 cho các slide, youtube.com/watch?v=RWRYX5eJbG0 cho video). Anh ấy xem qua rất nhiều công cụ hữu ích như " inclued " ( pecl.php.net/package/inclued ), xdebug và KCacheGrind.
TML

Tôi đã tìm thấy một bản vá cho xdebug , cung cấp thông tin bộ nhớ trong các cấu hình. Cho đến nay nó đang hoạt động rất tốt.
JW.

1
Như bạn nói, xdebug cung cấp thông tin trong dấu vết chức năng. May mắn thay, họ cũng cung cấp một script để giải thích điều đó. derickrethans.nl/xdebug-and-tracing-memory-usage.html Nó dường như được làm việc cho tôi cho đến nay ...
Luke H

Câu trả lời:


10

Xdebug theo dõi bộ nhớ được thực hiện lại trong 2.6 (2018-01-29) có thể được sử dụng trong Qcachegrind hoặc công cụ tương tự. Chỉ cần đảm bảo chọn tùy chọn bộ nhớ :)

Từ các tài liệu:

Kể từ Xdebug 2.6, trình biên dịch cũng thu thập thông tin về lượng bộ nhớ đang được sử dụng và chức năng nào các phương pháp aGnd đã tăng mức sử dụng bộ nhớ.

Tôi không quen với định dạng của tệp, nhưng Qcachegrind đã làm việc rất tốt cho tôi trong việc truy tìm một số vấn đề về bộ nhớ.

qcachegrind mẫu


4
Và họ thậm chí đã sử dụng vé của tôi. :)
JW.

Xdebug đã bỏ hỗ trợ cho PHP 5 trong bản phát hành 2.6.
powtac

Nếu nó giúp ích cho bất kỳ ai ... khi sử dụng php-fpm, pid có thể không thay đổi giữa các yêu cầu khác nhau. Với profiler_output_name mặc định, điều này dẫn đến xdebug ghi đè dữ liệu trước đó. Thay đổi giá trị này bằng cái gì khác từ xdebug.org/docs/all_settings#trace_output_name
aligot

Tôi đang cố gắng sử dụng qcachegrind bây giờ và không hiểu tôi đang xem gì. Tôi không thấy số bộ nhớ ở đâu cả. Mỗi biến chiếm bao nhiêu bộ nhớ? Tôi muốn thứ gì đó có thể theo dõi quá trình thực thi và hiển thị bộ nhớ tại mỗi điểm và những biến nào đang chiếm bộ nhớ đó. Tôi có thể lấy thêm thông tin về điều này ở đâu?
john ktejik

72

Như bạn có thể biết, Xdebug đã bỏ hỗ trợ cấu hình bộ nhớ kể từ phiên bản 2. *. Vui lòng tìm kiếm chuỗi "chức năng bị loại bỏ" tại đây: http://www.xdebug.org/updates.php

Đã loại bỏ các chức năng

Đã xóa hỗ trợ cho cấu hình Bộ nhớ vì nó không hoạt động bình thường.

Vì vậy, tôi đã thử một công cụ khác và nó hoạt động tốt cho tôi.

https://github.com/arnaud-lb/php-memory-profiler

Đây là những gì tôi đã làm trên máy chủ Ubuntu của mình để kích hoạt nó:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof
echo "extension=memprof.so" > /etc/php5/mods-available/memprof.ini
sudo php5enmod memprof
service apache2 restart

Và sau đó trong mã của tôi:

<?php

memprof_enable();

// do your stuff

memprof_dump_callgrind(fopen("/tmp/callgrind.out", "w"));

Cuối cùng mở callgrind.outtệp bằng KCachegrind

Sử dụng gperftools của Google (được khuyến nghị!)

Trước hết, hãy cài đặt Google gperftools bằng cách tải xuống gói mới nhất tại đây: https://code.google.com/p/gperftools/

Sau đó, như mọi khi:

sudo apt-get update
sudo apt-get install libunwind-dev -y
./configure
make
make install

Bây giờ trong mã của bạn:

memprof_enable();

// do your magic

memprof_dump_pprof(fopen("/tmp/profile.heap", "w"));

Sau đó, mở thiết bị đầu cuối của bạn và khởi chạy:

pprof --web /tmp/profile.heap

pprof sẽ tạo một cửa sổ mới trong phiên trình duyệt hiện tại của bạn với một cái gì đó như hình dưới đây:

Cấu hình bộ nhớ PHP với memprof và gperftools

Xhprof + Xhgui (theo ý kiến ​​của tôi là tốt nhất để cấu hình cả cpu và bộ nhớ)

Với XhprofXhgui, bạn có thể định cấu hình việc sử dụng cpu hoặc chỉ sử dụng bộ nhớ nếu đó là vấn đề của bạn vào lúc này. Đó là một giải pháp rất hoàn chỉnh, nó cung cấp cho bạn toàn quyền kiểm soát và các bản ghi có thể được ghi cả trên mongo hoặc trong hệ thống tệp.

Để biết thêm chi tiết, hãy xem câu trả lời của tôi tại đây .

Lửa đen

Blackfire là một hồ sơ PHP của SensioLabs, Symfony2 guys https://blackfire.io/

Nếu bạn sử dụng Puphpet để thiết lập máy ảo của mình, bạn sẽ rất vui khi biết nó được hỗ trợ ;-)


Bạn đã làm cho nó hoạt động như thế nào? Tôi đã cố gắng đưa memprof_enablevào mã PHP của mình và tôi nhận được PHP Fatal error: Uncaught Error: Call to undefined function memprof_enable(). Tôi đã thực hiện cài đặt gperftools từ mã nguồn hiện tại của chúng.
Andrey Pokhilko

Chạy php -itrên cli hoặc a phpinfo()để xem liệu bạn có đang tải tiện ích mở rộng đúng cách hay không. Nếu bạn không có nó, có lẽ bạn nên xem *.inicác tệp của mình .
Francesco Casula

5
Lưu ý: phiên bản mới nhất chỉ hỗ trợ php7. Nếu bạn sử dụng php5, hãy cài đặt với sudo pecl install memprof-1.0.0.
Djizeus

18

Chà, đây có thể không phải là chính xác những gì bạn đang tìm kiếm, nhưng PHP có một vài chức năng được tích hợp sẵn để sử dụng bộ nhớ. Nếu bạn chỉ muốn xem một cuộc gọi hàm đang sử dụng bao nhiêu bộ nhớ, bạn có thể sử dụng memory_get_peak_usage () trước và sau một cuộc gọi, và lấy sự khác biệt.

Bạn sử dụng kỹ thuật tương tự đối với dữ liệu của mình bằng cách sử dụng memory_get_usage () rất giống nhau .

Cách tiếp cận khá đơn giản nhưng đó là một cách nhanh chóng để kiểm tra một đoạn mã. Tôi đồng ý rằng đôi khi các delta ghi nhớ xdebug có thể quá dài dòng để hữu ích, vì vậy tôi thường chỉ sử dụng nó để thu hẹp thành một phần mã, sau đó sử dụng bộ nhớ cụ thể cho các phần nhỏ theo cách thủ công.


0

http://geek.michaelgrace.org/2012/04/tracing-php-memory-usage-using-xdebug-and-mamp-on-mac/

Tôi đang sử dụng máy Mac nên nếu bạn đang sử dụng Windows, bạn sẽ phải kiểm tra điều này, nhưng điều này phù hợp với tôi.

Tôi đã sửa đổi tệp tracefile-analyzer.php của mình và thêm đường dẫn đến tệp nhị phân PHP ở trên cùng để bạn có thể gọi nó trong thiết bị đầu cuối như một tập lệnh unix bình thường.

#!/Applications/MAMP/bin/php5.3/bin/php
<?php
if ( $argc <= 1 || $argc > 4 )
{

Đừng quên chmod tệp này thành 755.

Bạn có thể dễ dàng tạo một tập lệnh ruby ​​watchr để tự động gọi tập lệnh mỗi khi nó tạo tệp hồ sơ bộ nhớ (* .xt). Bằng cách đó, bạn có thể tiếp tục thử nghiệm và xem các cải tiến của mình mà không cần phải thực hiện lệnh lặp đi lặp lại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.