How To Debug PHP using Xdebug, NetBeans, and Docker On Ubuntu
This tutorial provides all the steps required to debug PHP applications containerized with Docker containers using Xdebug and NetBeans on Ubuntu.
In this tutorial, we will discuss the terms specific to debugging and the steps required to debug PHP programs using Xdebug 3 and NetBeans for PHP applications containerized using Docker containers on Ubuntu 20.04 LTS. It assumes that Docker and NetBeans are already installed on the Ubuntu system.
You can also follow How To Install Docker Engine on Ubuntu 20.04 LTS, Containerize PHP with Apache, MySQL, and MongoDB using Docker Containers, Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers, and How To Install NetBeans 12 for PHP on Ubuntu 20.04 LTS.
I am following Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers for this tutorial.
This tutorial assumes that you have opened your project in NetBeans and also configured it for the appropriate browser to launch the application.
This section explains all the major terms specific to debugging. These are listed below.
Current Instruction Pointer - The instruction pointer pointing to the current statement where the debugger is paused and waiting for the next instructions.
Breakpoint - The program execution pauses at the breakpoint until further instructions are not provided by the debugger. The breakpoints are added intentionally to check the program for possible errors.
Step Into - Move to the next statement in case there is no function call or enter the function to debug it in case there is a function call on the current statement. We can step into the function called on the current statement to further check it. The execution will pause at the first statement of the function.
Step Out or Step Return - Execute the remaining statements of the function completely and move out of the function and set the instruction pointer on the statement next to the function call.
Step Over - Execute the current statement without going into the function if it's there. It skips the function and executes it without entering into it.
Resume - Resume the execution as the program executes normally till the next breakpoint encounters. The program execution will pause at the next breakpoint if there is any.
Pause - Pause the current execution. The instruction pointer will point to the statement where the execution pause.
Stop - Terminate the current execution of the program and clear the variables stack and breakpoints from memory.
To demonstrate using Xedug for PHP, I will use the same setup done in Containerize PHP with NGINX, MySQL, and MongoDB using Docker Containers. In this step, we will create the Xdebug configuration file and also update the PHP Dockerfile to install and configure Xdebug for PHP.
xdebug.client_port = 9003
RUN apt-get update
RUN apt-get install -y autoconf pkg-config libssl-dev
RUN docker-php-ext-install pdo pdo_mysql mysqli
RUN pecl install mongodb
RUN echo "extension=mongodb.so" >> /usr/local/etc/php/conf.d/mongodb.ini
RUN pecl install xdebug-3.1.2
ADD xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
Now, run the build and up commands of Docker Compose.
mysql uses an image, skipping
phpmyadmin uses an image, skipping
mongo uses an image, skipping
mongo-express uses an image, skipping
Step 7/8 : RUN pecl install xdebug-3.1.2
---> Running in c3258a080bb2
downloading xdebug-3.1.2.tgz ...
Starting to download xdebug-3.1.2.tgz (230,023 bytes)
.................................................done: 230,023 bytes
93 source files, building
PHP Api Version: 20210902
Zend Module Api No: 20210902
Zend Extension Api No: 420210902
Starting mongo ... done
Starting php ... done
Starting mysql ... done
Starting pma ... done
Recreating mexpress ... done
Starting nginx ... done
Attaching to mysql, mongo, php, pma, nginx, mexpress
php | [14-Dec-2021 02:36:42] NOTICE: fpm is running, pid 1
php | [14-Dec-2021 02:36:42] NOTICE: ready to handle connections
We can verify whether Xdebug is installed by checking the PHP info output as shown in Fig 1.
Configure NetBeans for Xdebug
In this step, we will configure NetBeans for Xdebug. Now, right-click the Project and click Properties from the available options. We can configure the project webroot as shown in Fig 2.
Also, configure the Run Configuration as shown in Fig 3.
Click the OK Button to apply the changes. We also need to configure NetBeans for Xdebug. Now, click Tools -> Options -> PHP -> Debugging and configure the debugger port and session ID as shown in Fig 4.
Click the Apply Button to apply the changes. Also, click the OK Button to close the dialog.
Debug PHP using Xdebug and NetBeans
In this step, we will create the PHP script for debugging, in case it's not ready yet. We can create the PHP file by right-clicking the source folder and selecting PHP as the file type. I have created the PHP script named debug.php as shown in Fig 5.
Now, add breakpoints on lines 2 and 6 by clicking on the area at the left of the line numbers as shown in Fig 6.
At last, we will start the debugging session to listen to the breakpoints added by us. Also, make sure to keep the Docker Container running before starting the debugging session. Now, right-click the PHP script i.e. debug.php, and click the Debug option as shown in Fig 7.
It will start the debugging session and launch the script using the browser configured for the project. I have configured Firefox as the project browser and the launch should be similar to Fig 8.
Also, the debugger will pause at the first breakpoint added by us at line number 2 as shown in Fig 9. NetBeans will maintain the variables and methods call stack as shown in Fig 9.
Now, click the Step Over Icon or press F8 to move to the next step. We can also click the Continue Icon to move to the next breakpoint. Also, keep a note of the variables stack after clicking the Step Over Icon. It should initialize the variable $numbers in the example given by me and as highlighted in Fig 10.
Now again press F8 to move the execution to the next statement. It should initialize the $i variable to 0. We can click the Continue Icon or press F5 to move to the next breakpoint which is the same i.e. line number 6 in our case. Also, check the value of the variables $i and $number after clicking the Continue Icon as shown in Fig 11. We can keep on debugging our code till we are done.
We can always click the Stop Icon or press Shift + F5 to stop the execution.
In case of a function call, we can also click the Step Into Icon or press F7 to move the execution to the first statement of the function.
This is all about debugging the source code using NetBeans.
This tutorial provided all the steps to install and configure Xdebug in a Docker container. It also provided the steps to configure Xdebug for NetBeans and to execute and debug our programs.