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

Beveiliging van Laravel 101

In deze blogpost gaan we dieper in op een aantal veelvoorkomende Laravel beveiligingsfouten.

Auteur: Robbe Reygel
PHP developer
laravel

Test Driven Development - toepassing op een project

TDD, of voluit Test Driven Development, is een aanpak van ontwikkeling waarbij we vertrekken van het schrijven van tests. 

Auteur: Sarah Jehin
PHP developer
Sarah Jehin
development

De OSLO-standaard: hoe gestandaardiseerde gegevensuitwisseling ons verder brengt

De OSLO-standaard is een term die je misschien wel eens hebt horen vallen in de context van gegevensuitwisseling en digitale transformatie, maar wat houdt het precies in en wat zijn de voordelen ervan?

Auteur: Benjamin Verhaegen
PHP Developer
benjamin_verhaegen
shaking_hands_black_white

De toekomst van web applicaties: wat kunnen we verwachten?

In de afgelopen jaren hebben web applicaties een enorme evolutie doorgemaakt. Maar wat heeft de toekomst voor ons in petto? Je ontdekt het allemaal in deze blog.

Author: Tom Van den Eynden
Web Architect | Coordinator
Tom Van den Eynden
computerscherm met code

Het verschil tussen gegevensbeheer en gegevensverwerking in een digitale economie

Gegevens zijn cruciaal voor bedrijven en het begrijpen van de verschillen tussen gegevensbeheer en gegevensverwerking kan verwarrend zijn. In dit artikel zullen we deze verschillen in de digitale economie nader bekijken om hun doelen en toepassingen beter te begrijpen.

Author: Tom Van den Eynden
Web Architect | Coordinator
Tom Van den Eynden
gegevensverwerking

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!

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