---
description: https://viblo.asia/p/debug-code-php-voi-xdebug-va-sublime-text-3-YmjeoVYmGqa
---

# Debug code PHP với Xdebug và Sublime Text 3

```
https://techblog.vn/debug-code-php-voi-xdebug-va-sublime-text-3
```

`Debug code` - chúng ta phải làm việc này rất nhiều. Viết code chạy một cách trơn tru ngay lần đầu tiên luôn thì rất là khó và chỉ có một số ít người (nếu có) làm được. Trong bài viết này, chúng ta sẽ xem thử làm thế nào để có thể debug với `Xdebug` kết hợp với `Sublime Text`.

### Bắt đầu <a href="#bat-dau-0" id="bat-dau-0"></a>

Trước hết ta cần cài đặt `extension PHP Xdebug`. Có thể tham khảo hướng dẫn dưới đây ([http://kennyroh.blogspot.com/2016/02/install-xdebug-php7-on-ubuntu.html](http://kennyroh.blogspot.com/2016/02/install-xdebug-php7-on-ubuntu.html))

```
wget http://xdebug.org/files/xdebug-2.4.0rc2.tgz

tar zxvf xdebug-2.4.0rc2.tgz

cd xdebug-2.4.0RC2/

phpize

./configure --enable-xdebug --with-php-config=/usr/bin/php-config

make

make test

make install

cd /etc/php/mods-available

sudo vi xdebug.ini

thêm vào file xdebug.ini đoạn dưới đây
-----------------------------

; configuration for php xdebug module

; priority=10

zend_extension=xdebug.so

----------------------------

cd /etc/php/7.0/cli/conf.d

sudo ln -s /etc/php/mods-available/xdebug.ini 10-xdebug.ini
```

Hãy chắc chắn rằng `Xdebug` đang hoạt động bằng cách kiểm tra `phpinfo()`. Tất nhiên chúng ta cũng cần `Sublime Text`. Tôi sẽ sử dụng phiên bản mới nhất: `Sublime Text 3`. Nó cũng hoạt động được với `Sublime Text 2`.

### Cấu hình Xdebug <a href="#cau-hinh-xdebug-1" id="cau-hinh-xdebug-1"></a>

Cần phải cấu hình `Xdebug` bằng cách thêm dòng sau vào file `php.ini`, hoặc tốt hơn là thêm vào file `xdebug.ini`.

```
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_log="/var/log/xdebug/xdebug.log"
```

Thường thì chúng ta sử dụng trên địa chỉ local `127.0.0.1`. Tuy nhiên, nếu bạn đang sử dụng `vagrant` chẳng hạn, thì địa chỉ sẽ khác, có thể là `10.0.2.2`.

`Remote log` có thể không cần thiết, nhưng trong trường hợp các vấn đề xảy ra, đó là nơi mà bạn có thể tìm thấy thông tin về các lỗi.

Đừng quên khởi động lại `webserver`!

### Cấu hình Sublime Text 3 <a href="#cau-hinh-sublime-text-3-2" id="cau-hinh-sublime-text-3-2"></a>

Một trong những thế mạnh của `Sublime` là bạn có thể mở rộng nó một cách dễ dàng với các `package`. Trong trường hợp này, chúng ta sẽ cài đặt `package Xdebug`. Hãy chắc chắn rằng bạn đã cài đặt `package control`.

Sau khi cài đặt `package control` xong, bật `Sublime Text 3`. Mở cửa sổ câu lệnh tìm kiếm (Ctrl + Shift + P) và tìm "`install package`".

![sublime11.png](https://viblo.asia/uploads/eadd1548-56d9-4b61-9c5e-b45f7261f379.png)

Chúng ta sẽ tìm `package` "`Xdebug client`".

![sublime21.png](https://viblo.asia/uploads/a0093e72-1875-4dd9-8000-d8395cecf025.png)

Bước cuối cùng chúng ta phải làm là cấu hình project trong `Sublime`. Cách đơn giản nhất để làm điều này là mở thư mục gốc của project, chọn menu `Project` và chọn “`Save projects as`”. Tôi khuyên nên lưu file này trong thư mục gốc của project, để có thể lưu nó trong hệ thống `version control` của bạn và bạn có thể cấu hình nó một cách dễ dàng.

Mở file vừa tạo ra. Nội dung sẽ giống như thế này:

```
{
    "folders":
    [
        {
           "follow_symlinks": true,
           "path": "."
        }
    ]
}
```

Chúng ta sẽ bổ sung thêm một vài dòng:

```
{
    "folders":
    [
        {
            "follow_symlinks": true,
            "path": "."
        }
    ],
    "settings": {
        "xdebug": {
             "url": "http://my.local.website/",
        }
    }
}
```

Như bạn thấy, tôi chỉ thêm vào `URL` của ứng dụng web. Tôi có thể thiết lập nhiều cài đặt hơn cho `Xdebug`, nhưng thế này là đủ để bắt đầu. Tôi cũng có thể thiết lập `URL` này trong chính cài đặt của `Xdebug`, nhưng trong trường hợp đó, tôi không thể làm việc trên nhiều project mà không cần phải thay đổi cấu hình `Xdebug` mỗi lần.

### Khởi động phiên làm việc của Xdebug <a href="#khoi-dong-phien-lam-viec-cua-xdebug-3" id="khoi-dong-phien-lam-viec-cua-xdebug-3"></a>

Bây giờ chúng ta có thể bắt đầu phiên làm việc của `Xdebug` và xem liệu mọi thứ đã được cài đặt đúng chưa. Trong menu, chọn `Tools` -> `Xdebug` và chọn `start debugging (launch browser)`. Bạn sẽ thấy trang web của bạn được mở ra và tham số `?XDEBUG_SESSION_START=sublime.xdebug` được thêm vào cuối `URL`. Và phiên làm việc của `Xdebug` sẽ bắt đầu. Trong `Sublime`, một số bảng phụ xuất hiện là nơi hiển thị thông tin debug, sau khi bạn đã đặt các `breakpoints`.

### Breakpoints <a href="#breakpoints-4" id="breakpoints-4"></a>

Hãy đặt một `breakpoint` đầu tiên. Một `breakpoint` về cơ bản là một cái cờ nơi mà ứng dụng của bạn sẽ tạm dừng khi chạy đến đó. Tại thời điểm nó tạm dừng, bạn có thể kiểm tra giá trị tất cả các biến để bạn biết thực tế những gì đang xảy ra.

Chúng ta có thể thêm một `breakpoint` bằng cách click chuột phải trên một dòng, chọn `Xdebug` và chọn `add/remove breakpoint`. Một điểm đánh dấu sẽ được thêm vào lề của dòng đó để chỉ ra rằng một `breakpoint` đã được đặt.

![sublime31.png](https://viblo.asia/uploads/b56b20d8-2619-4632-8336-0bf75fc0f825.png)

Chúng ta mở trình duyệt một lần nữa và tiếp tục. Bạn sẽ thấy ngay khi bạn đến trang nơi `breakpoint` được đặt, trang web sẽ ngừng tải. Mở `Sublime` và bạn sẽ thấy rất nhiều thông tin hiện ra trong các bảng của `Xdebug`.

Các `Xdebug stack` và `Xdebug context` rất thú vị. Trong `stack`, bạn có thể nhìn thấy toàn bộ `stacktrace` mà bạn đã đi qua.

Trong `context`, bạn sẽ thấy tất cả các biến toàn cục, và cả các biến bạn tự định nghĩa. Bạn có thể click vào các biến để xem chính xác bên trong các biến. Ví dụ, trong hình dưới đây, tôi chọn biến `$ _SERVER`.

![sublime41.png](https://viblo.asia/uploads/f68d75cf-4c80-41fd-88bd-b256ff432579.png)

Chú ý rằng có một mũi tên màu vàng chỉ vào dòng mà tại đây ứng dụng đang dừng lại.

Ung dụng của chúng ta đã dừng lại và bây giờ chúng ta có thể xem qua các biến được định nghĩa. Tuy nhiên, chúng ta đã xem xong và muốn đi tiếp. Làm gì bây giờ? Khi bạn nhấp chuột phải một lần nữa chọn menu `Xdebug`, bạn sẽ có các lựa chọn:

* **Run** Chạy ứng dụng cho đến khi tới điểm dừng tiếp theo hoặc cho đến khi kết thúc.
* **Run to line** sẽ chạy đến dòng bạn click vào.
* **Step into** sẽ nhảy vào hàm hiện tại và dừng lại ngay sau đó.
* **Step over** sẽ nhảy qua hàm hiện tại và dừng lại ngay sau đó.
* **Step out** sẽ nhảy ra khỏi hàm hiện tại và dừng lại ngay sau đó.
* **Stop** sẽ dừng việc sửa lỗi.
* **Detach** cũng sẽ dừng việc sửa lỗi.

Chạy và dừng thì khá dễ hiểu. Các hàm nhảy có thể gây nhầm lẫn. Hãy xem một ví dụ đơn giản.

```
Class Foo()
{

    public function bar(Array $arr)
    {
        $arr = self::fooBar($arr); // Breakpoint
        return $arr;
    }

    public function fooBar(Array $arr)
    {
        return array_values($arr);
    }
}
```

Hãy tưởng tượng bạn thêm một `breakpoint` vào dòng đầu tiên của hàm `bar`. Trên dòng có comment breakpoint (// breakpoint).

Với **step into**, trình gỡ lỗi sẽ nhảy vào hàm `fooBar` và sẽ dừng lại ở dòng đầu tiên trong đó. Trong trường hợp này, trình gỡ lỗi sẽ dừng ở dòng `return array_values($arr);`

**Step over** sẽ gọi hàm, nhưng sẽ không dừng lại. Nó sẽ dừng lại ở dòng tiếp theo sau khi gọi hàm. Vì vậy, trong trường hợp này, nó sẽ dừng lại ở `return $arr;`

Cuối cùng, với **step out** nó sẽ chạy qua toàn bộ hàm `bar` và trả về nơi đã gọi nó. Trong trường hợp này, nó sẽ nhảy ra ngoài của đối tượng, trở về đối tượng gọi gốc.

Nếu bạn cứ `run`, ứng dụng sẽ chạy thêm cho đến thời điểm nó được thực thi xong hoặc`breakpoint` khác xảy ra.

### Kết luận <a href="#ket-luan-5" id="ket-luan-5"></a>

Trong bài viết này chúng ta đã biết cách tích hợp `Xdebug` với `Sublime` và hiểu cách gỡ lỗi. Hầu hết các IDE cho PHP đều có thể tích hợp với `Xdebug`. Bạn đang sử dụng `breakpoint`? Hay bạn đang sử dụng hàm PHP như `var_dump` để debug? Xin mời comment chia sẻ bên dưới!

_Dịch từ bài viết của tác giả **Peter Nijssen** tại địa chỉ_ [_https://www.sitepoint.com/debugging-xdebug-sublime-text-3/_](https://www.sitepoint.com/debugging-xdebug-sublime-text-3/)\
