-Tác giả Shameer C-

PHP là một ngôn ngữ phổ biến nhất cho các nhà lập trình web, nhưng lại gặp sự chỉ trích rất lớn rằng nó thiếu một chương trình debug phù hợp. các nhà phát triển sử dụng các ngôn ngữ như Java, C# có hẳn một bộ các công cụ debug hiệu quả, thường được tích hợp trực tiếp với IDE. Nhưng bản chất bị ngắt kết nối của web servers và các PHP IDEs đã ngăn cản chúng tôi phát triển thêm nhiều công cụ khả dụng. Chúng tôi đã phải tự debug code bằng cách thêm các câu lệnh kiểm tra.. cho đến khi có Xdebug.

Xdebug là một dự án mã nguồn mở miễn phí của Derick Rethans và là một trong những PHP extension hữu ích nhất. Nó không chỉ cung cấp công cụ debug cơ bản mà còn hỗ trợ stack trace, profiling,.. Bài viết này sẽ trình bày cách cài đặt và cấu hình Xdebug. Debug ứng dụng PHP bằng Netbeans như thế nào, và giải thích cách đọc một profiling report trong KCchegrind.

Cài đặt và cấu hình Xdebug

Nếu bạn sử dụng XAMPP hoặc MAMP, Xdebug đã được cài đặt sẵn, bạn chỉ cần kích hoạt nó trong
php.ini . Còn nếu bạn đang sử dụng một gói phần mềm cài đặt dựa trên một nên tảng như Ubuntu, bạn có thể cài đặt nó thông qua Package manager với lênh như apt-get intall php5-Xdebug

Cấu hình Xdebug trong file php.ini như sau:

[xdebug]
zend_extension="/Applications/MAMP/bin/php5.2/lib/php/extensions/no-debug-non-zts-20060613/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_host=localhost
xdebug.remote_port=9000

Zend_extension xác định đường dẫn đến module Xdebug. Giá trị xdebug.remote_enable thay đổi bất chấp phần mở rộng có đang hoạt động hay không. Xdebug.remote_host là tên hoặc địa chỉ IP của hệ thống bạn sử dụng (ở đây tôi điền localhost để chạy ngay trên local, nhưng giá trị có thể là một địa chỉ IP hoặc một DNS tùy thuộc vào mục đích của bạn). Xdebug.remote_port là cổng mà client lắng nghe một kết nối từ Xdebug (9000 là cổng mặc định)

Khi sử dụng Xdebug, điều quan trọng để đảm bảo bạn không sử dụng bất kỳ Zend extension nào vì chúng có thể xung đột với Xdebug.

Có nhiều quyền chọn cài đặt khác khá là tốt. Trang web Xdebug cung cấp một ứng dụng đơn giản hướng dẫn bạn cài đặt. Bạn có thể lấy đầu ra của phpinfo() hoặc php-i và dán nó vào Text box, sẽ có hướng dẫn phân tích cấu hình máy chủ đang sử dụng và chỉ cho bạn cách biên dịch Xdebug cho máy tính của bạn.

Debug

Để debug ta luôn có xu hướng sử dụng kết hợp var_dump() và exit/die() . Nhưng ở phương pháp này, ta buộc phải điều chỉnh code để debug, bạn phải nhớ mọi chỗ thêm câu lệnh output để loại bỏ chúng sau khi đã debug xong. Xdebug khắc phục được điều này bằng cách cho bạn tạm dừng thực hiện ứng dụng của bạn khi bạn muốn kiểm tra giá trị của các biến trong phạm vi đó để xác định rõ những gì PHP đang thực hiện.

Bạn có thể dễ dàng cấu hình Netbeans để hoạt động như một client của Xdebug. Mở cửa sổ options (Tool > Options) và chọn tab Debugging trong phần PHP. Nhập vào cổng Debugger như trong file php.in và Session ID để sử dụng khi debug.

Bây giờ bạn sẽ có thể chạy chương trình debug bằng cách nhấn vào Debug trong tab Tools.

Học lập trình web PHP trực tuyến

Với tập tin mã nguồn mở ra, nhấn nút Debug trong thanh Tools để bắt đầu debug . Các ứng dụng sẽ được mở ra trên trình duyệt, và việc chạy PHP sẽ tạm dừng ở dòng đầu tiên của tập tin nếu bạn đã kích hoạt “Stop at first line ” trong cửa sổ Options. Nếu không, nó sẽ chạy cho đến khi nó gặp Breakpoint đầu tiên . Từ đó bạn có thể tiếp tục chạy cho đến các breakpoits tiếp theo bằng cách sử dụng nút continue.

Thông báo trong URL của Brower thanh tham số XDEBUG_SESSION_START . Để kích hoạt các chương trình gỡ rối bạn phải vượt qua XDEBUG_SESSION_START như một tham số yêu cầu (GET/POST) hoặc XDEBUG_SESSION như một tham số cookie.

Có một số thao tác hữu ích khác trong Debugging toolbar. Đó là:

Step over – Nhảy qua dòng hiện đang thực hiện

Step into – Nhảy vào function (đối với function không dựng sẵn)

Step out – Nhảy ra khỏi function hiện tại

Bạn có thể thêm breakpoint bằng cách nhấn vào cột số dòng ở biên của editor. Chúng có thể được loại bỏ bằng cách nhấp vào chúng một lần nữa . Ngoài ra, vào Window> Debugging> breakpoint sẽ liệt kê tất cả các Breakpoints trong chương trình của bạn và bạn có thể select/deseclect những breakpoints bạn cần.

Trong khi chạy , trạng thái của các biến trong phạm vi hiện tại được hiển thị trong cửa sổ biến . Nó sẽ hiển thị các giá trị của các biến local và các biến super global như $ _COOKIE , $ _GET , $ _POST và $ _SERVER . Bạn có thể xem giá trị thay đổi khi bạn chạy qua các câu lệnh.

Học lập trình trực tuyến cơ bản đến nâng cao

Profiling

Profiling là bước đầu tiên khi tối ưu hóa các ứng dụng. Công cụ Profiling ghi lại các thông tin quan trọng như thời gian cần để các câu lệnh và function thực hiện, số lần chúng được gọi,… Output có thể được phân tích để tìm được các nút thắt.
Xdebug cũng có thể được sử dụng như một công cụ profiling cho PHP. Để bắt đầu profiling ứng dụng của bạn, thêm các thiết lập sau đây cho php.ini :

xdebug.profiler_enable = 1
xdebug.profiler_output_name = xdebug.out.%t
xdebug.profiler_output_dir = /tmp
xdebug.profiler_enable_trigger = 1

Mặc định Profiling bị vô hiệu hóa trong Xdebug , nên xdebug.profiler_enable dùng để kích hoạt nó. xdebug.profiler_output_name là tên file log ( t % chỉ định gắn thêm thời gian vào tên file; xem tài liệu danh sách đầy đủ các chỉ định) . Xdebug lưu trữ profiling trong thư mục được chỉ định bởi xdebug.profiler_output_dir . Bạn có thể có thể thay đến một thư mục khác, nhưng thư mục đó phải có quyền ghi cho tài khoản người dùng, để kịch bản PHP được chạy .

Profiling làm giảm hiệu suất vì PHP phải ghi lại chi tiết của các function , vì thế bạn không muốn chạy nó toàn bộ thời gian. xdebug.profiler_enable_trigger chỉ thị Xdebug để thực hiện profiling chỉ khi XDEBUG_PROFILE được thông qua như một tham số GET hoặc POST.

Các file log được tạo bởi Xdebug có thể nhỏ hoặc lớn tùy thuộc vào việc các ứng dụng đang làm gì. Ngoài ra, nó không thực sự thân thiện khi đọc. Bạn sẽ muốn sử dụng các chương trình như kcachegrind hoặc Webgrind để xem lại. Kcachegrind là một công cụ đọc dữ liệu profiling cho KDE, trong đó cần có một môi trường Unix để chạy, trong khi Webgrind là một công cụ dựa trên web.

Mở tập tin Profiling lớn trong KCachegrind sẽ hiển thị các chi phí của mỗi function được gọi bắt đầu từ main() . Đây là hình KCachegrind của profiling đầu ra của một function để tìm một nhân tố:

Học lập trình online cơ bản đến nâng cao

Bảng điều khiển bên trái (Function Profile) cho biết thời gian thực hiện của từng chức năng theo lệnh. Bảng điều khiển phía trên bên phải đồ họa hiển thị các thông tin tương tự cùng kích thước tương ứng với tiêu phí của các chức năng. Đồ thị cuộc gọi đại diện cho mối quan hệ giữa các function trong ứng dụng. Trong ví dụ này chỉ có hai function, main () và fact() . fact() là một hàm đệ quy, được chỉ định sử dụng một vòng trong đồ thị.

Trong khi tối ưu hóa Code, bạn nên tìm kiếm các khu vực với tổng chi phí cao nhất. Thường thì thực hiện I/O sẽ có chi phí cao nhất. Nhớ giảm bớt chúng càng nhiều càng tốt. Lazy load tập tin bất cứ lúc nào có thể.

Giả sử bạn có một lớp tên “đơn đặt hàng” cung cấp cho bạn một danh sách của tất cả các đơn đặt hàng và chi tiết của họ từ web của bạn.

<?php
class Orders
{
    protected $db;
 
    public function __construct(PDO $db) {
        $this->db = $db;
    }
     
    public function getAll() {
        $orders = array();
        $query = "SELECT * FROM orders";
        $result = $this->db->query($query);
        while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
            $row['details'] = 
                $this->getDetails($row['orderId']);
            $orders[] = $row;
        }
 
        return $orders;
    }
     
    public function getDetails($orderId){
        $details = array();
        $result = $this->db->query("SELECT * FROM orderdetails WHERE orderId = " . $orderId);
        while ($row = $result->fetch(PDO::FETCH_ASSOC)) {
            $details[] = $row;
        }
        return $details;
    }
}

Lớp này có hai phương thức: GetAll(), và GetDetail(). Khi bạn gọi phương thức GetAll(), ta sẽ nhận được tất cả các bản ghi từ bảng đơn đặt hàng và sử dụng vòng lặp để có được mọi chi tiết của tất cả các bản ghi.

Hãy xem các thông tin của Profiling:

Học lập trình web PHP cơ bản


Mặc dù con số tuyệt đối là không đáng kể vì chúng còn dựa vào điều kiện nền tảng và thời gian chạy, nhưng bạn sẽ hình dung được chi phí tương đối của các chức năng khác nhau. Chú ý rằng một số function được gọi hàng trăm lần (dĩ nhiên là không tốt). Các mã không cần phải lặp qua tất cả các đơn đặt hàng để nhận được các chi tiết của mỗi đơn đặt hàng riêng. Hãy viết lại
GetAll () để sử dụng JOIN thay thế.

<?php
pubilc function getAll() {
    $orders = array();
    $query = "SELECT * FROM orders o
        JOIN orderdetails d ON o.orderId = od.Id
        ORDER BY o.orderId
        ";
    $result = $this->db->query($query);
    while($row =$result->fetch(PDO::FETCH_ASSOC)){
        $orders[] = $row;
    }
    return $orders;
}

Bây giờ số lượng các truy vấn đã giảm, Profiling mang lại một kết quả tốt hơn. Ngoài ra, các mã này không gọi được chức năng

getDetails()

nữa.

Học lập trình online ở đâu chất lượng nhất

Tổng Kết

Xdebug hoạt động như một trung gian kiểm soát việc thực hiện các chương trình PHP trong máy chủ. Trong bài viết này, bạn đã nhìn thấy hai trong số những tính năng ấn tượng nhất của Xdebug – Hỗ trợ debug và hỗ trợ profiling.

Debug từ xa cho phép bạn kiểm tra giá trị tại thời gian chạy, mà không sửa đổi chương trình của bạn, để có hiểu rõ hơn về những gì PHP đang làm. Profiling sẽ giúp phát hiện ra tắc nghẽn trong mã của bạn để bạn có thể tối ưu hóa nó cho hiệu suất tốt hơn.

Hy vọng bài viết này sẽ giúp bạn nhận ra những lợi ích của Xdebug và khuyến khích bạn bắt đầu sử dụng nó ngay lập tức nếu bạn chưa sử dụng.