Xdebug In Phpstorm



Published on 2020-06-21 • Modified on 2020-10-18

In this post, we will see how to do step by step debugging with Xdebug, Symfony and PHPStorm. We will do a basic example where we will stop the execution of the Symfony code just before rendering a template to check the data passed to it. Let's go! 😎

Configuring XDebug for PHPStorm. Modern software development requires sophisticated and highly specialized tools to achieve the perfect balance between speed and accuracy when it comes to creating complex services and applications. Particular examples of such tools are the IDE, which guides the developer through the entire project structure. The following video describes how to debug PHP applications using PHP Xdebug extension and PHPStorm.The video describes this on Windows Xampp installation, b. Learn how to configure XDebug and PHPUnit in PHPStorm, allowing you to write better tests and fix bugs faster. Test Driven Development (TDD) is an old topic, I know, but it seems many people don't understand how it makes you write better code. The point here is that one of the most important benefits it's to use debugging tools together with. Debugging with xdebug and PhpStorm The basic idea in PhpStorm is that you tell it where to look for the xdebug session (the “server”) and then you tell it how to link the files it’s running in the VM to the files found in the repo (called “mapping”). What follows are opinionated defaults, so adjust as.

» Published in 'A week of Symfony 704' (22-28 June 2020).

Phpstorm

Prerequisite

I will assume you have a basic knowledge of PHP, Symfony and that you know how to modify your PHP configuration thanks to the php.ini file.

Introduction

Why this blog post? Well, because of this tweet:

PHP developers that don't use Xdebug for debugging are amateurs.

— Derick Rethans 🔶 (@derickr) June 20, 2020

This is the kind of tweet I don't like, a typical troll, trying to make a generality of something more complex. It brings negativity as It can be interpreted by people not using Xdebug by:

“If you don't use Xdebug, you aren't a real developer.” 😔

Even it's not what Derick meant to say, it's what people may understand. There is no smiley. We don't know if the tweet is pure sarcasm or not. I wanted to answer at first. But what about transforming something negative to something positive and useful? 😀 That's why I decided to write this blog post. 🙂

Configuration

I use the following configuration, but it should be OK with previous versions of each of these components. Here, I use the Symfony binary to serve my application. If you use another type of setup (Apache, Docker...), you'll probably have to make small adjustments to the following instructions.

  • PHP 7.4
  • Symfony 5.2
  • Xdebug 2.9.6
  • PHPStorm 2020.3

Installation

I will assume you have a working PHP/Symfony installation. So first let's install Xdebug, it can be done with PECL:

If not done, activate the Xdebug extension in your php.ini file. You can find this file by running:

Verify that in this file, the xdebug.so (or .dll) library is loaded. You must see a line like the following (it can also be loaded in an external file like conf.d/ext-xdebug.ini):

If everything is OK, you should now see Xdebug when getting the PHP version:

Or when grepping the module list:

The debug bar also shows if Xdebug is available when you pass over the Symfony version number with your mouse:


Now that Xdebug is activated let's see how to configure it for PHPStorm.

Configuring Xdebug and PHPStorm

Xdebug

First, we must enable the remote option of Xdebug. Add the following parameter in your PHP configuration as we did previously:

We keep the other default parameters to keep the configuration as minimal as possible. So, with this setup, the port used by Xdebug is 9000 and the default IP address is 127.0.0.1. Check out the xdebug.remote_host and xdebug.remote_port parameters in the documentation.

PHPStorm

Now, let's check the configuration inside PHPStorm. Open the menu entry: Run > Web Server Debug Validation. You should see this window:


In the first parameter put the full path of your project public directory where is stored the Symfony front controller (generally public/index.php with Symfony 5). In the second parameter, put the local URL of your project. Then click on validate. If everything is OK, you should see ✅ like above. You can ignore the error of the last line, it seems to be a known problem, but it won't prevent the debugger from working. The final step is to tell PHPStorm to start listening to Xdebug connections. It must be done with the Run > Start Listening for PHP Debug connections menu entry.

Step by step debugging

Now that PHPStorm has validated our setup let's try to add our first breakpoint. Open one of your controllers and click between the line number and the start of the code editor panel of the line you want to stop the execution. A red disc 🔴 appears like this (at line 33 in this example):


Now, open your browser and access a page that calls the action where we put the breakpoint. If it works, PHPStorm gets back as the active window of your OS, and you get the following output:


As you can see, the code window is different from what we use to have. First, after the controller method declaration line, we have the values of the parameters received by the action. $_locale is 'en', $goals is an array with two keys, and lastly, $articleRepository is the Doctrine repository of the Article entity. Just below, we see that the line of the breakpoint is highlighted; this is to show that the code has stopped here like expected. Just before this line, after the declaration of the $data (at the right), we see the value of this new variable. It is empty as we just declared it.
Just below, in the debug panel, we have a Variables section where we can inspect all the local variables available at the breakpoint.


This panel is very convenient; we can see all the variables (even the globals) and expand them to check their content. We also find the function parameters ($_locale, $goals, $articleRepository). As this controller extends the Symfony AbstractController, we can notice that it has access to the dependency injection container ($this->container).

Now let's try to advance to the next 'step', to go to the next line. We can use the 'Step over' button (F6 with my setup).


As you can see the highlighted line has changed, it's now line n°34. We can see the value of the $date variable just above. This new $date variable is now part of the 'Variables' panel. We can continue like this until the end of the action to check that the $data array contains the correct keys and values and can be passed to the Twig template. To continue the execution of the script, click on the 'Resume program' button ⏯️ (F8).
If you don't need the breakpoint for now but want to keep it for later, you can right-click on it and deselect the 'Enabled' option. The red disc appears now as a circle. Refresh the page, and you will notice that the script doesn't stop anymore.

The browser extension

We can also install a browser extension (available for Firefox, Chrome, Safari, Opera) to disable/enable the debug on the fly. When disabled, nothing is caught by PHPStorm even there are still some active breakpoints. It is faster than deactivating the breakpoint manually or altogether disable Xdebug in the PHP configuration. It looks like this:


Conclusion

Et voilà! We have a practical step by step debugging workflow using Xdebug! What about telling Derick that we are now professionals PHP developers? 😁

About the original tweet, I really liked the answer of Jordi; this is precisely what I think:

I can see a debugger being valuable when code is very complex or unknown, and often use it in JS. In PHP code though I usually am familiar enough with what libs I use and find no benefit to debugging interactively. Like most things, it depends. No need to call people amateurs IMO

— Jordi Boggiano (@seldaek) June 20, 2020To see parodic tweets of the original one, click on this link 😜.

If you don't drink Guinness you are an amateur

— Gary Hockin (@GeeH) June 20, 2020

PHP developers who don’t use @doctrineproject are amateurs.

— Jonathan H. Wage (@jwage) June 20, 2020

Developers that don't use a computer to develop are amateurs

Xdebug In Phpstorm— Gregoire Pineau (@lyrixx) June 21, 2020

PHP developers that don't write there own frameworks are amateurs

— Simon Bennett (@MrSimonBennett) June 20, 2020

PHP developers that write bugs and need to debug are amateurs. https://t.co/NG5YtmdD3k

— Liam Hammett (@LiamHammett) June 20, 2020

That's it! I hope you like it. Check out the links below to have additional information related to the post. As always, feedback, likes and retweets are welcome. (see the box below) See you! COil. 😊

They gave feedback and helped me to fix errors and typos in this article, many thanks to jmsche. 👍

Did you like this post? You can help me back in several ways: (use the Tweet on the right to comment or to contact me )

  • Report any error/typo.
  • Report something that could be improved.
  • Like and retweet!
  • Follow me on Twitter
  • Subscribe to the RSS feed.
  • Click on the More on Stackoverflow buttons to make me win 'Announcer' badges 🏅.

Thank you for reading! And see you soon on Strangebuzz! 😉

[🇬🇧] New blog post, this is my answer to the tweet: 'PHP developers that don't use #Xdebug for debugging are amateurs.' https://t.co/SPd8UIOrQ8 Proofreading, comments, likes and retweets are welcome! 😉Annual goal: 4/6 (66%) #php#strangebuzz#blog#blogging#debug#bug#blogging

— COil #StaySafe 🏡 #OnEstLaTech ✊ (@C0il) June 23, 2020

Introducing CW: a cache watcher for Symfony

Adding a custom data collector in the Symfony debug bar

Learn how to configure XDebug and PHPUnit in PHPStorm, allowing you to write better tests and fix bugs faster.

Test Driven Development (TDD) is an old topic, I know, but it seems many people don’t understand how it makes you write better code. The point here is that one of the most important benefits it’s to use debugging tools together with tests, making your flow more efficient.

I started using TDD on the command line, and still use it sometimes, but since I started using PHPStorm and decided to try how it handles tests, and that’s amazing! When you add debugging tools – like XDebug – to it everything starts making sense, then you have the feeling you’re on the right path.

PHPStorm has a dedicated interface to run and debug tests, almost in the same window, what makes the process of writing code safer and easier.

I’m not gonna teach you how to write tests and even how TDD is good. I’m assuming you already have some tests written and just want to run them in PHPStorm, debugging with XDebug. I’m gonna use the tests from my open source project Corcel.

PHPStorm

Configuring XDebug

First let’s configure XDebug in PHPStorm. We’re assuming here you already have the xdebug PHP extension installed. In my case, I’m using Laravel Valet, and it runs on the port 9000, the same port XDebug runs by default. So I had to update my php.ini file to change its port to 9001. My config file is located at /usr/local/etc/php/7.2/conf.d/ext-xdebug.ini:

When type php -v in the command line I can saw the XDebug extension enabled:

Then, in PHPStorm (I’m using currently version 2017.3), go to Preferences and Languages & Frameworks -> PHP -> Debug. Configure your XDebug port and uncheck some pre-checked options, just to avoid creating unnecessaries break points.

Configuring PHPUnit

First we must tell PHPStorm which PHP version we’re using and where is that PHP binary. This is necessary for code checks in the IDE and for running PHPUnit. Just set that in your IDE’s preferences window. You should set something like this:

Now go to Run -> Edit Configurations. Here we’re going to create a new configuration related to PHPUnit, give it the phpuni name and say PHPStorm we’d like to use the configurations in our phpunit.xml file.

Running Tests

Now let’s run all tests Corcel has. Go to Run -> Run and then select phpunit. This is the name we gave to the configuration we just created. You’ll see a new tab on the bottom of the window with all your tests running:

Running a Single Test

In this case we run all 139 tests. The point here is you can run just one test case or even the last one. In this new tab if you click on a single test case in the left sidebar and Control + Shift + R you’ll run just that specific test. The same can be used when you’re inside a class and want to run just one test/method. Inside any part of that method, if you press this shortcut you’ll run that test case. If you press the shortcut outside a test case method you’ll run tests for that specific class, all them.

Running the Last Test

If you’re fixing a bug in another class, not the test one, and you want to run that test again to see if it’s passing now. You can press Control + R shortcut. This tells PHPStorm to run the last run test, only. Then you don’t have to change the current file you are to run the last test case. Very useful!

Just to remember, Control + Shift + R to run the current test case you are, and Control + R to run the last run test case.

Debugging while Running Tests

The point here is you enabled XDebug. So you can debug while testing. Let’s take a simple test case from Corcel:

I’m gonna add a break point inside the $comment->isApproved() method, like this:

New Shortcuts to Debug

You know the shortcuts to run a single current test case (Control + Shift + R) and the last run test case (Control + R). If you to go the test case source code and run it you will not stop anywhere, because you’re running the test only.

To run tests with debugging support use Control + Shift + D for the single test case and Control + D for the last one, just replacing R by D.

If you run the same test with debugging support you’ll stop on that breakpoint, and then the magic starts happening. You will get a lot of information at that specific point, like current variables content and even continuing the executing step by step. You’ll get all that in the same tab you saw your tests running:

Then, debug your code. You have to useful commands/button to press. Here are some examples:

Conclusion

TDD and Debugging are two important steps in development. Once you start using them you cannot stop, but for sure, you’re writing better and safer code, believe me.

Phpstorm Xdebug Ssh

I hope this post helped you to start with testing and debugging in PHPStorm and made you feel excited about start using that. If you want to use a project to start testing and debugging you can clone Corcel on your machine and start running its tests in PHPStorm.