PhpStorm: Hướng Dẫn Remote Debug Ứng Dụng PHP Chạy Trong Docker Container

Nguyễn Đạt

Đối với các ứng dụng phức tạp việc xuất hiện lỗi là điề rất hay xảy ra. Do đó phát hiện ra nguyên nhân phát sinh ra lỗi trong ứng dụng (hay còn gọi là kỹ thuật debug ứng dụng) là một trong những kỹ thuật quan trọng và cần thiết đối với các developer. Trong bài viết này chúng ta cùng tìm hiểu cách debug ứng dụng chạy trong docker container trên PhpStorm sử dụng Xdebug là debugger.

Tìm Hiểu Quy Trình Remote Debug Trên Docker Container

Thông thường khi debug ứng dụng bạn sẽ thấy IDE và Xdebug chạy trên cùng một host (máy tính của bạn). Trong trường hợp bạn phải debug ứng dụng chạy trong Docker container thì khi đó do debugger và IDE chạy trên hai host khác nhau nên sẽ được gọi là remote debug. Trong đó bạn cần lưu ý rằng trong quá trình debug ứng dụng thì Xdebug đóng vài trò là một client và IDE đóng vai trò là server (hay remote_host).

Mô hình remote debug với Xdebug

Khi Xdebug được cấu hình đúng thì với mỗi một request gửi tới ứng dụng (chạy trong Docker container) thì:

  • Bước 1: Xdebug sẽ bắt đầu quá trình debug bằng việc gửi một reqest tới IDE (đóng vai trò là server) và ở cổng 9000
  • Bước 2: Trên IDE lúc này, bạn (với vai trò là người lập trình) sẽ setup các breakpoint trên IDE, IDE sẽ trả về thông tin các dòng code cần được dứng lại (break) để phân tích. IDE sẽ trả về các dữ liệu các điểm break points này.
  • Bước 3: Xdebug dựa trên thông tin nhận được sẽ trả về dữ liệu có trong ứng dụng tại điểm breakpoint đã được setup tương ứng trên IDE.
  • Bước 4: IDE hiển thị thông tin này.

Okie lý thuyết tới đây là đủ, bây giờ chúng ta sẽ bắt đầu vào việc setup Xdebug và PhpStorm.

Cài Đặt và Cấu Hình Xdebug Trong Container

Bước đầu tiên bạn cần làm đó cài đặt Xdebug trong container chạy ứng dụng. Trên Linux bạn có thể sử dụng PECL để cài đặt Xdebug:

$ sudo pecl install xdebug

Nếu bạn chứa có PECL trên máy bạn có thể cài đặt sử dụng câu lệnh sau:

$ sudo yum install php-pear

Sau đó kích hoạt Xdebug bằng cách thêm dòng code sau vào file cấu hình PHP php.ini dành cho web server được sử dụng để chạy ứng dụng trên container:

zend_extension="/usr/local/php/modules/xdebug.so"

Sau khi restart web server bạn sẽ thấy Xdebug xuất hiện trong kết quả khi gọi hàm phpinfo().

Trên Mac OS X bạn có thể cài đặt Xdebug sử dụng Homebrew:

$ brew install php56-xdebug

Một bước quan trọng khi cấu hình Xdebug đó là thông số xdebug.remote_host, bạn cần gán giá trị cho trường này là giá trị địa chỉ IP local của host trên đó chạy IDE hay chính là địa chỉ IP local của máy tính bạn.

xdebug.remote_host=10.0.1.42

Vì port mặc định trên đó Xdebug sẽ sử dụng để gửi request tới IDE là 9000 nên bạn có thể bỏ qua cấu hình dưới đây nếu muốn:

xdebug.remote_port=9000

Cài Đặt PhpStorm Plugin

Bước tiếp theo đó là cài đặt plugin của PhpStorm để cho phép IDE này listen các request gửi tới cổng 9000. Plugin được sử dụng cho việc remote debug trên PhpStorm có tên là Docker Integration. Sau khi cài đặt plugin này bạn cần cấu hình path mapping thư mục chứa code của ứng dụng trên host với thư mục code của ứng dụng trên Docker container. Điều này giúp Xdebug map đúng địa chỉ của các breakpoint trong sourcode code của ứng dụng trên host với source code ứng dụng trong container.

Xdebug path mapping

Listen Xdebug Request Trên PhpStorm

Để các request gửi bởi Xdebug từ bên trong container ra host được xử lý thì bạn cần nhấp vào biểu tượng Start Listening for PHP Debug Connections trong PhpStorm như hình dưới đâu:

Start Xdebug trên PhpStorm

Tới đây rất nhiều bạn nghĩ rằng việc cấu hình Xdebug đã hoàn thành. Tuy nhiên để Xdebug có thể bắt đầu hoạt động sau khi nhận được request từ host gửi vào bên trong container (bước 1) thì bạn cần phải gửi kèm Xdebug Cookie trong Request. Cookie đặc biệt này có tên là XDEBUG_SESSION_START và Xdebug sẽ bắt đầu khi giá trị của trường này là 1. Bạn có thể gán cookie này thủ công bằng cách sử dụng console của trình duyệt:

Start Xdebug session sử dụng cookie

Ngoài ra bạn cũng có thể cài đặt addon PhpStorm Xdebug cho trình duyệt và sử dụng nó thay vì cách gán cookie thủ công như ở trên.

Cuối dùng bạn mở trình duyệt và gửi một request từ bên ngoài host tới ứng dụng để test Xdebug. Trong trường hợp Xdebug không connect được với IDE ngoài host thì bạn cần kiểm tra xem container có thể kết nối tới cổng 9000 trên host hay không. Giả sử host của bạn có địa chỉ local IP là 192.168.1.17 thì bạn có thể chạy câu lệnh sau trong container để kiểm tra cổng 9000 của host:

# telnet 192.168.1.17 9000

Nếu trong trường hợp bạn không thể connect được tới cổng 9000 ngoài host từ bên trong container bạn cần mở port 9000 trên host.

Chúc bạn thành công.

Thêm Phản Hồi

Bài Viết Liên Quan