Cách đơn giản nhất để cấu hình một tập lệnh PHP


289

Cách dễ nhất để cấu hình một tập lệnh PHP là gì?

Tôi thích xử lý một cái gì đó trên đó cho tôi thấy một đống tất cả các cuộc gọi chức năng và chúng mất bao lâu nhưng tôi cũng ổn khi đặt một cái gì đó xung quanh các chức năng cụ thể.

Tôi đã thử trải nghiệm chức năng microtime :

$then = microtime();
myFunc();
$now = microtime();

echo sprintf("Elapsed:  %f", $now-$then);

nhưng điều đó đôi khi mang lại cho tôi kết quả tiêu cực. Thêm vào đó, có rất nhiều rắc rối để rắc tất cả lên mã của tôi.


7
này Mark, hãy xem bình luận này để giúp bạn giải quyết những bình luận tiêu cực: ro.php.net/manual/en/feft.microtime.php#99524
Mina

16
Nhận xét đó được liên kết bởi @ REiane không có ý nghĩa. Nếu nó có vẻ giải quyết vấn đề của người bình luận, thì đó hẳn là một sự trùng hợp. Chỉ sử dụng microtime()sẽ dẫn đến đôi khi đánh giá các biểu thức như : "0.00154800 1342892546" - "0.99905700 1342892545", sẽ đánh giá như : 0.001548 - 0.999057. Bạn có thể sử dụng microtime( TRUE )để tránh vấn đề đó, như được chỉ ra bởi @luka.
JMM

Câu trả lời:


104

Phần mở rộng APD PECL được sử dụng như sau:

<?php
apd_set_pprof_trace();

//rest of the script
?>

Sau đó, phân tích tệp được tạo bằng cách sử dụng pprofp.

Ví dụ đầu ra:

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

Cảnh báo: bản phát hành mới nhất của APD là ngày 2004, phần mở rộng không còn được duy trì và có nhiều vấn đề về khả năng tương tác khác nhau (xem bình luận).


19
Phần mở rộng APD bị hỏng trên php 5.4.
Skynet

Khi vặn lại user45015, tôi đã có thể làm cho nó hoạt động trên một trang web chạy wordpress 3.8.1 và PHP 5.3.10 và nó dường như hoạt động tốt.
Supernovah

1
@Supernovah, user456015 đã nói PHP 5.4. Ông không nói rằng nó đã bị hỏng trên PHP 5.3.
Magnus

@ user1420752 Tôi đang chạy 5.3.27 và nó cũng không chạy ở đó. Tôi nhận được một lỗi chức năng không xác định.
Fractaly

2
Bản phát hành mới nhất của APD là từ năm 2004 (!) Nó không hoạt động với PHP 7. Khi thử cài đặt cho PHP 5 pecl install apd, nó sẽ đưa ra một thông báo lỗi về "config.m4". Có vẻ như bạn phải cài đặt nó từ nguồn mà tôi chưa thử. Nghiêm túc mà nói, không có một công cụ lược tả dựa trên CLI hiện đại, được cập nhật cho PHP để cài đặt với Homebrew, yêu cầu thiết lập tối thiểu và cho đầu ra dễ đọc của con người?
forthrin

267

Bạn muốn xdebug tôi nghĩ. Cài đặt nó trên máy chủ, bật nó lên, bơm đầu ra thông qua kcachegrind (cho linux) hoặc wincachegrind (cho windows) và nó sẽ hiển thị cho bạn một vài biểu đồ đẹp chi tiết về thời gian, số lượng và cách sử dụng bộ nhớ chính xác (nhưng bạn sẽ cần một phần mở rộng khác cho điều đó).

Nó đá, nghiêm túc: D


6
Tôi thấy điều này dễ thực hiện hơn nhiều so với giải pháp APD. Nhưng có lẽ đó là vì một số lý do APD không biên dịch đúng trên hệ thống của tôi. Ngoài ra các biểu đồ của kcachegrind cũng đẹp như đã hứa.
wxs

1
@EvilPuppetMaster, bạn cần biên dịch php với --enable-memory-limit hoặc sử dụng phiên bản php hiện đại hơn. Xem xdebug.org/docs/basic#xdebug_memory_usage
Mercutio

52
xdebug + webgrind nhanh chóng trở thành vũ khí lựa chọn của tôi để lập hồ sơ nhanh chóng và dễ dàng. code.google.com/p/webgrind
xkcd150

6
xdebug + xdebug_start_trace () + xdebug_stop_trace () = win
quano

3
Điều này rất dễ dàng để làm việc trên Windows với XAMPP. Đã có netbeans được cấu hình cho xdebug. Điều duy nhất bạn cần làm là thay đổi cài đặt xdebug trong php.ini thành xdebug.profilerDefput_name = "cacheegrind.out.% T-% s" nếu không sẽ không có đầu ra nào được tạo. Yêu cầu khởi động lại apache.
người mới bắt

97

Không cần tiện ích mở rộng, chỉ cần sử dụng hai chức năng này để định hình đơn giản.

// Call this at each point of interest, passing a descriptive string
function prof_flag($str)
{
    global $prof_timing, $prof_names;
    $prof_timing[] = microtime(true);
    $prof_names[] = $str;
}

// Call this when you're done and want to see the results
function prof_print()
{
    global $prof_timing, $prof_names;
    $size = count($prof_timing);
    for($i=0;$i<$size - 1; $i++)
    {
        echo "<b>{$prof_names[$i]}</b><br>";
        echo sprintf("&nbsp;&nbsp;&nbsp;%f<br>", $prof_timing[$i+1]-$prof_timing[$i]);
    }
    echo "<b>{$prof_names[$size-1]}</b><br>";
}

Dưới đây là một ví dụ, gọi prof_flag () với một mô tả ở mỗi điểm kiểm tra và prof_print () ở cuối:

prof_flag("Start");

   include '../lib/database.php';
   include '../lib/helper_func.php';

prof_flag("Connect to DB");

   connect_to_db();

prof_flag("Perform query");

   // Get all the data

   $select_query = "SELECT * FROM data_table";
   $result = mysql_query($select_query);

prof_flag("Retrieve data");

   $rows = array();
   $found_data=false;
   while($r = mysql_fetch_assoc($result))
   {
       $found_data=true;
       $rows[] = $r;
   }

prof_flag("Close DB");

   mysql_close();   //close database connection

prof_flag("Done");
prof_print();

Đầu ra trông như thế này:

Bắt đầu
   0,004303
Kết nối với DB
   0,003518
Thực hiện truy vấn
   0,000308
Truy xuất dữ liệu
   0,000009
Đóng DB
   0,000049
Xong


37

Đăng chéo tài liệu tham khảo của tôi từ phiên bản tài liệu SO đang ngoại tuyến.

Hồ sơ với XDebug

Một phần mở rộng cho PHP có tên Xdebug có sẵn để hỗ trợ cấu hình các ứng dụng PHP , cũng như gỡ lỗi thời gian chạy. Khi chạy trình lược tả, đầu ra được ghi vào một tệp ở định dạng nhị phân gọi là "cacheegrind". Các ứng dụng có sẵn trên mỗi nền tảng để phân tích các tệp này. Không có thay đổi mã ứng dụng là cần thiết để thực hiện hồ sơ này.

Để kích hoạt cấu hình, hãy cài đặt tiện ích mở rộng và điều chỉnh cài đặt php.ini. Một số bản phân phối Linux đi kèm với các gói tiêu chuẩn (ví dụ php-xdebuggói của Ubuntu ). Trong ví dụ của chúng tôi, chúng tôi sẽ chạy hồ sơ tùy chọn dựa trên một tham số yêu cầu. Điều này cho phép chúng tôi giữ các cài đặt tĩnh và chỉ bật trình lược tả khi cần.

# php.ini settings
# Set to 1 to turn it on for every request
xdebug.profiler_enable = 0
# Let's use a GET/POST parameter to turn on the profiler
xdebug.profiler_enable_trigger = 1
# The GET/POST value we will pass; empty for any value
xdebug.profiler_enable_trigger_value = ""
# Output cachegrind files to /tmp so our system cleans them up later
xdebug.profiler_output_dir = "/tmp"
xdebug.profiler_output_name = "cachegrind.out.%p"

Tiếp theo, hãy sử dụng ứng dụng khách web để gửi yêu cầu tới URL của ứng dụng mà bạn muốn lập hồ sơ, ví dụ:

http://example.com/article/1?XDEBUG_PROFILE=1

Khi trang xử lý, nó sẽ ghi vào một tệp có tên tương tự như

/tmp/cachegrind.out.12345

Theo mặc định, số trong tên tệp là id quá trình đã viết nó. Đây là cấu hình với các xdebug.profiler_output_namethiết lập.

Lưu ý rằng nó sẽ ghi một tệp cho mỗi yêu cầu / quy trình PHP được thực thi. Vì vậy, ví dụ, nếu bạn muốn phân tích một bài đăng mẫu, một hồ sơ sẽ được viết cho yêu cầu GET để hiển thị biểu mẫu HTML. Tham số XDEBUG_PROFILE sẽ cần được chuyển vào yêu cầu POST tiếp theo để phân tích yêu cầu thứ hai xử lý biểu mẫu. Do đó, khi lập hồ sơ đôi khi dễ dàng hơn để chạy curl để POST một biểu mẫu trực tiếp.

Phân tích đầu ra

Sau khi viết bộ đệm hồ sơ có thể được đọc bởi một ứng dụng như KCachegrind hoặc Webgrind . PHPStorm, một IDE PHP phổ biến, cũng có thể hiển thị dữ liệu lược tả này .

KCachegrind

KCachegrind, ví dụ, sẽ hiển thị thông tin bao gồm:

  • Chức năng được thực thi
  • Thời gian gọi, cả chính nó và bao gồm các cuộc gọi chức năng tiếp theo
  • Số lần mỗi hàm được gọi
  • Biểu đồ cuộc gọi
  • Liên kết đến mã nguồn

Bạn cần tìm gì

Rõ ràng điều chỉnh hiệu suất là rất cụ thể cho từng trường hợp sử dụng của ứng dụng. Nói chung, thật tốt khi tìm kiếm:

  • Các cuộc gọi lặp đi lặp lại đến cùng chức năng mà bạn không muốn thấy. Đối với các hàm xử lý và truy vấn dữ liệu, đây có thể là cơ hội chính để ứng dụng của bạn lưu vào bộ đệm.
  • Chức năng chạy chậm. Ứng dụng dành phần lớn thời gian ở đâu? phần thưởng tốt nhất trong điều chỉnh hiệu năng là tập trung vào những phần của ứng dụng tiêu tốn nhiều thời gian nhất.

Lưu ý : Xdebug, và đặc biệt là các tính năng định hình của nó, rất tốn tài nguyên và làm chậm quá trình thực thi PHP. Không nên chạy chúng trong môi trường máy chủ sản xuất.


3
Thêm vào danh sách các công cụ để phân tích bộ đệm hồ sơ: PhpStorm cũng có một công cụ để xem trước bộ đệm hồ sơ
peterchaula

1
@peter Tôi quên PHPStorm có tính năng đó. Tôi đã thêm nó với một liên kết đến tài liệu. Cảm ơn!
Matt S

Bất kỳ cách nào để có được một báo cáo văn bản (không phải GUI) trực tiếp trên máy chủ?
Alexander Shcheblikin

1
@Mark bạn có thể đánh dấu đây là câu trả lời, xin vui lòng. Câu trả lời hiện tại đã lỗi thời ngay cả khi được đăng và không hoạt động trong nhiều năm. Điều này không hiệu quả, và tôi biết không có phương pháp nào tốt hơn.
Mawg nói rằng phục hồi Monica

24

Nếu trừ microtimes cho kết quả âm tính, hãy thử sử dụng hàm với đối số true( microtime(true)). Với true, hàm trả về một float thay vì một chuỗi (giống như khi nó được gọi mà không có đối số).


24

Thành thật mà nói, tôi sẽ lập luận rằng sử dụng NewRelic cho hồ sơ là tốt nhất.

Đó là một phần mở rộng PHP dường như không làm chậm thời gian chạy và chúng thực hiện giám sát cho bạn, cho phép truy sâu sâu. Trong phiên bản đắt tiền, họ cho phép khoan sâu (nhưng chúng tôi không đủ khả năng cho mô hình định giá của họ).

Tuy nhiên, ngay cả với gói miễn phí / tiêu chuẩn, rõ ràng và đơn giản trong đó hầu hết các loại trái cây treo thấp. Tôi cũng thích rằng nó cũng có thể cho bạn một ý tưởng về tương tác DB.

ảnh chụp màn hình của một trong các giao diện khi định hình


16
Relic mới trông đầy hứa hẹn, chắc chắn. Tuy nhiên, phần "Tiết lộ dữ liệu ứng dụng của bạn" trong Chính sách bảo mật của họ đã đẩy lùi tôi ngay lập tức. Imho, chia sẻ các đoạn mã nguồn độc quyền với các bên thứ ba là quá nhiều.
Cengiz Can

8
Không nhảy vào phòng thủ của họ ở đây, nhưng có vẻ như "Dữ liệu ứng dụng" chỉ là thông tin hiệu suất và thông tin cấu hình hệ thống, không phải mã nguồn ứng dụng của bạn.
David Shields

Fir thánh tích mới của tôi đang hiển thị "WebTransaction" của tôi là 99% thời gian và không có tài khoản chuyên nghiệp cho "ApplicationTraces"
Karthik T

1
hãy thử đăng ký tại: newrelic.com/rackspace <sẽ cung cấp cho bạn "tiêu chuẩn" miễn phí
zeroasterisk

15

Hồ sơ người nghèo, không cần gia hạn. Hỗ trợ các cấu hình lồng nhau và phần trăm của tổng số:

function p_open($flag) {
    global $p_times;
    if (null === $p_times)
        $p_times = [];
    if (! array_key_exists($flag, $p_times))
        $p_times[$flag] = [ 'total' => 0, 'open' => 0 ];
    $p_times[$flag]['open'] = microtime(true);
}

function p_close($flag)
{
    global $p_times;
    if (isset($p_times[$flag]['open'])) {
        $p_times[$flag]['total'] += (microtime(true) - $p_times[$flag]['open']);
        unset($p_times[$flag]['open']);
    }
}

function p_dump()
{
    global $p_times;
    $dump = [];
    $sum  = 0;
    foreach ($p_times as $flag => $info) {
        $dump[$flag]['elapsed'] = $info['total'];
        $sum += $info['total'];
    }
    foreach ($dump as $flag => $info) {
        $dump[$flag]['percent'] = $dump[$flag]['elapsed']/$sum;
    }
    return $dump;
}

Thí dụ:

<?php

p_open('foo');
sleep(1);
p_open('bar');
sleep(2);
p_open('baz');
sleep(3);
p_close('baz');
sleep(2);
p_close('bar');
sleep(1);
p_close('foo');

var_dump(p_dump());

Sản lượng:

array:3 [
  "foo" => array:2 [
    "elapsed" => 9.000766992569
    "percent" => 0.4736904954747
  ]
  "bar" => array:2 [
    "elapsed" => 7.0004580020905
    "percent" => 0.36841864946596
  ]
  "baz" => array:2 [
    "elapsed" => 3.0001420974731
    "percent" => 0.15789085505934
  ]
]

13

PECL XHPROF trông cũng xen kẽ. Nó có giao diện HTML có thể nhấp để xem báo cáo và tài liệu khá đơn giản . Tôi vẫn chưa thử nó.


Có vẻ như nó không nhận được nhiều tình yêu. Cập nhật lần cuối vào năm 2009, không có gói PEAR cho 5.3, 5.4 và xa hơn nữa ...
dland

1
Facebook đã tạo một ngã ba với sự hỗ trợ thông qua php 5.5 github.com/facebook/xhprof
borkencode

Kiểm tra ngã ba này cũng đề xuất một số điều chỉnh bổ sung: github.com/preinheimer/xhprof
Fedir RYKHTIK

xhprof.io cung cấp GUI cho dữ liệu được thu thập bằng XHProf, cũng như khả năng lưu trữ dữ liệu trong cơ sở dữ liệu cho mục đích phân tích lịch sử. Tôi là tác giả của việc thực hiện sau này.
Gajus

10

Tôi thích sử dụng phpDebug để định hình. http://phpdebug.sourceforge.net/www/index.html

Nó xuất ra tất cả thời gian sử dụng / bộ nhớ cho bất kỳ SQL nào được sử dụng cũng như tất cả các tệp được bao gồm. Rõ ràng, nó hoạt động tốt nhất trên mã được trừu tượng hóa.

Đối với hồ sơ chức năng và lớp tôi sẽ chỉ sử dụng microtime()+ get_memory_usage()+ get_peak_memory_usage().



6

Để đo điểm chuẩn, như trong ví dụ của bạn, tôi sử dụng gói Điểm chuẩn lê . Bạn đặt điểm đánh dấu để đo. Lớp này cũng cung cấp một vài trình trợ giúp trình bày hoặc bạn có thể xử lý dữ liệu khi bạn thấy phù hợp.

Tôi thực sự có nó được bọc trong một lớp khác với phương thức __desturation. Khi một tập lệnh thoát, đầu ra được ghi thông qua log4php vào syslog, vì vậy tôi có rất nhiều dữ liệu hiệu suất để làm việc.


3

XDebug không ổn định và không phải lúc nào cũng có sẵn cho phiên bản php cụ thể. Ví dụ: trên một số máy chủ tôi vẫn chạy php-5.1.6, - đó là những gì đi kèm với RedHat RHEL5 (và btw vẫn nhận được các bản cập nhật cho tất cả các vấn đề quan trọng), và XDebug gần đây thậm chí không biên dịch với php này. Vì vậy, tôi đã kết thúc với việc chuyển sang trình gỡ lỗi DBG, điểm chuẩn php của nó cung cấp thời gian cho các hàm, phương thức, mô-đun và thậm chí cả các dòng.


2

Tất cả các bạn chắc chắn nên kiểm tra trình hồ sơ php mới này.

https://github.com/NatyByNorthwest/php-spx

Nó định nghĩa lại cách thức các trình biên dịch php thu thập và trình bày kết quả. Thay vì chỉ xuất ra tổng số các lệnh gọi hàm cụ thể và tổng thời gian thực hiện nó - PHP-SPX trình bày toàn bộ dòng thời gian thực hiện yêu cầu theo cách hoàn toàn dễ đọc. Dưới đây là màn hình của GUI mà nó cung cấp.

nhập mô tả hình ảnh ở đây

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.