Als je de ontwikkelingssnelheid wilt verdubbelen tijdens het gebruik van Xdebug, dan leer je 't hier.

Xdebug

Huidige problematiek

Lokaal ontwikkelen wij in een Docker omgeving. Standaard maken we gebruik van custom geoptimaliseerde NGINX, PHP & MySQL containers. Dit wordt meestal nog uitgebreid met specifieke containers afhankelijk van het project.

Het gebruik van Xdebug is zeer handig bij de ontwikkeling. Al onze lokale PHP containers hebben deze module dan ook standaard aan staan.
Het grote nadeel is dat dit zeer resource-heavy is en de laadtijd van je pagina dus ook redelijk vertraagt, zelfs als je de debugger niet hebt ingeschakeld in PHPStorm, wat toch het merendeel van de tijd is.

Betere benadering

In een ideaal scenario laden we de Xdebug module enkel wanneer we deze nodig hebben, en dus niet voor alle andere requests naar de applicatie.

Een oplossing hiervoor bestaat erin om 2 PHP containers te gebruiken. 1 mét en 1 zonder de Xdebug module ingeschakeld. Zo kunnen we gebruik maken van de 'snellere' php container als we Xdebug niet nodig hebben en schakelen we over op de PHP Xdebug container als we effectief willen debuggen.

Door gebruik te maken van een cookie kunnen we via NGINX aangeven welke PHP container we wensen te gebruiken.

Gebruik 2 PHP containers

We maken naast onze standaard PHP container met naam php een nieuwe container aan met de naam php-dev. Beide containers laden verschillende Docker images in, namelijk:

  • php container maakt gebruik van een PHP Docker image zonder Xdebug
  • php-dev container gebruikt een PHP Docker image mét de Xdebug module ingeschakeld

Voorbeeld

services:
  php:
    image: some.docker.hub/php:7.3-fpm
  php-dev:
    image: some.docker.hub/php:7.3-fpm-dev

Configureer NGINX

De magic vindt plaats in NGINX. In onze configuratie luisteren we naar het al dan niet geplaatst zijn van een cookie.
Indien dit het geval is, dan kunnen we onze php-dev container aanspreken, zoniet sturen we de request naar onze default php container zonder Xdebug.

Volgende snippet plaats je bovenaan in je nginx configuratiefile. Dit zet een $domainService variabele met als standaardwaarde php, dit is meteen ook de hostname van onze PHP container. Van zodra een cookie met waarde XDEBUG_ wordt aangetroffen, zal $domainService de waarde php-dev krijgen, de hostname van onze Xdebug PHP container.

map $http_cookie $domainService {
  default php;
  "~*XDEBUG_" php-dev;
}

In onze vorige configuraties gaven we een standaard adres mee voor onze FastCGI server, namelijk php (de hostname van onze container).

fastcgi_pass php:9000;

In de nieuwe situatie veranderen we dit door onze $domainService variabele.

fastcgi_pass $domainService:9000;

 

Apache blijft niet in de kou staan

Mocht je om een bepaalde reden een applicatie hebben die gebruik maakt van Apache (requirements, Shibboleth, ...) is deze oplossing ook een mogelijkheid.

Binnen je <VirtualHost> tag voeg je het volgende toe

<FilesMatch \.php$>
    # Redirect to php-dev container with Xdebug loaded
    <If "%{HTTP_COOKIE} =~ /XDEBUG_/">
        SetHandler proxy:fcgi://php-dev:9000
    </If>
    <Else>
        SetHandler proxy:fcgi://php:9000
    </Else>
</FilesMatch>

 

Xdebug helper browser plugin

Installeer browser plugin

Eerst installeer je de Xdebug helper plugin in Chrome en/of Firefox.

Via de instellingen van de plugin voeg je een custom ide key toe, in ons geval "XDEBUG_".

Belangrijke noot

Als je wisselt in je browser tussen debuggen en niet-debuggen zal je nu ook steeds een andere sessie krijgen, aangezien er een andere container wordt aangesproken.

Indien je dus iets moet debuggen achter authentication, dien je eerst de xdebug helper in te schakelen in de browser. Nu heb je een nieuwe sessie waarin je je kan aanmelden.

Conclusie

Door gebruik te maken van deze implementatie laden onze pagina's meer dan dubbel zo snel in als we niet aan het debuggen zijn, wat voor een aanzienlijke tijdswinst zorgt. We hebben zo het beste van beide werelden, Xdebug als het nodig is en snelle responsetijden tijdens ontwikkeling.

Nood aan PHP experts? Wij zijn de PHP experts van België. 

Auteur: Wouter Aerts
Senior PHP developer
Wouter Aerts

More insights

Adressen register & GEOpunt API

Zelf al eens voor de keuze gestaan of je Google maps, openstreetmaps, of een andere GIS provider zou moeten gebruiken voor adres suggesties? Mocht je enkel Belgische adressen nodig hebben, lees dan zeker verder!

Auteur: Noah Gillard
PHP / Laravel Developer
Noah Gillard AI generated Face
Logo vlaamse overheid

Next.js: Het zoveelste framework?

Zowat om de 10 jaar komt er nieuwe technologie boven drijven, die een verandering teweeg brengt in de manier waarop we software ontwikkelen. Is Next.js deze nieuwe technologie?

Auteur: Dries Cappon
UX, Design, React.js, Next.js
Dries Cappon
Next.js

Laravel 10 release

The release of Laravel 10: The king of types. Alles wat je moet weten over de nieuwe major release!

Auteur: Noah Gillard
PHP / Laravel Developer
Noah Gillard AI generated Face
laravel 10 banner

Saloon - Package / SDK API integrations

API integraties voor een waaier aan services. Weinig tot geen herbruikbare code? Met Saloon maak je er een compacte / overzichtelijke SDK/Package van die je kan hergebruiken in al je projecten en kan maintainen op 1 plek.

Auteur: Noah Gillard
PHP / Laravel Developer
Noah Gillard AI generated Face
Saloon hero image

Codana wint Digital Champ of the year award 2022

Codana is de winnaar van de FeWeb Digital Champ award 2022

Auteur: Joris De Groot
Strategic Director and Managing Partner
Joris De Groot
FeWeb Digital Champ award Codana

De ideale eerste werkplek

Ik ben Ward Vandevoort, 22 jaar en begin november 2021 ben ik gestart bij Codana als junior backend developer. Ontdek mijn verhaal bij Codana! 

Auteur: Ward Vandevoort
Developer
Ward Vandevoort
groepsfoto