Debug PHP da riga di comando o app
Usare IntelliJ per debuggare PHP (anche da Docker) app da riga di comando, da app mobili eccIntelliJ può debuggare PHP, sia su un server remoto che dentro un container Docker. Leggete l’altro nostro articolo su come impostare IntelliJ per PHP.
Seguite i passi di quell’articolo per essere sicuri che PHP sia configurato per debuggare e configurato correttamente.
configurare IntelliJ
Per abilitare una sessione i debug da una app remota, dobbiamo aggiungere un’altra configurazione ad IntelliJ.
Cliccare il menu Run
e scegliere Edit configuration...
Aggiungete (l’icona [+]
in alto a destra) una nuova configurazione PHP Remote Debug
e impostarla
datele un nome. Qualsiasi, ma segnatevelo.
* Scegliere il Server
che hai impostato per il debug remoto di PHP
Siccome vogliamo iniziare il debug autonomo e non via una pagina web, dobbiamo abilitare queste due opzioni: tions:
- abilitare
Filter debug connection by IDE Key
. - impostare
IDE Key
con il valore che avete messo nel filexdebug.ini
. Se non lo avete fatto, andate e seguite le istruzioni. Per noi èINTELLIJ
.
Cliccate OK e salvate.
Poi impostate un breakpoint dove volete testare.
debug da riga di comando / CLI
Da dentro il vostro server remoto, o container Docker PHP, controllate che XDebug sia abilitato.
$ php -i | grep xdebug
.
Controllate che xdebug support => enabled
.
Ora esportate questa variabile nell’environment:
$ export PHP_IDE_CONFIG="serverName=docker_server"
Ovviamente docker_server
è il nome del server remoto come impostato in IntelliJ.
Poi cliccate sull’ “icona telefono” in alto a destra in IntelliJ. Deve diventare verde.
This tells IntelliJ to listen to the correct remote Ide Key debug.
A questo punto lanciate il comando php, ad esempio $ php artisan rotor:setup
(questo è un comando personalizzato Laravel). IntelliJ dovrebbe fermarsi sul breakpoint.
Se preferite, potete impostare quasi tutte le configurazioni di XDebug assieme al comando, così :
$ PHP_IDE_CONFIG="serverName=docker_server" php -dxdebug.remote_enable=1 -dxdebug.remote_autostart=On -dxdebug.idekey=INTELLIJ -dxdebug.remote_host=docker.for.mac.localhost -dxdebug.remote_port=9999 php artisan rotor:setup
Ad esempio cambiando ogni configurazione di XDebug. Ma XDebug deve comunque essere installato e abilitato.
Debug partendo da app mobili/altre app
Quando dovete debuggare una chiamata ad API che origina da una app client, ad esempio una app iOS/Android o magari Postmano alrti client, dovete dire a IntelliJ che il server PHP deve iniziare una sesione di debug di PHP. E la chiave è passare insiema alla chiamata HTTP un cookie con XDEBUG_SESSION
.
Ad esempio, in Postma si può impostare un cookie così: su una chiamata API, cliccate su “Cookie” e immettete il nome del server e poi Add Cookie
e create u cookie come questo:
XDEBUG_SESSION=INTELLIJ; path=/; domain=.rotor.local; Expires=Tue, 19 Jan 2038 03:14:07 GMT;
Ovviamente, cambiate i valori secondo la vostra impostazione.
Se abilitate il debug remoto (l’icona del telefono verde) in IntalliJ e impostate un breakpoint nella API. Chiamando da Postman, dovrebbe fermarsi.
In iOS è semplice come aggiungere queste linee nel vostro gestore di API, magari circondate da un #if per l’ambiente giusto
var urlRequest = URLRequest(url: url)
...
#if DEV
//activate Cookie for XDEBUG of PHP remote server. Setting a cookie with predefined IDE KEY/XDEBUG SESSION. Change accordingly
urlRequest.setValue("XDEBUG_SESSION=INTELLIJ; path=/; domain=rotor.local; Expires=Tue, 19 Jan 2099 03:14:07 GMT;", forHTTPHeaderField: "Cookie")
urlRequest.httpShouldHandleCookies = true
#endif
Per Android non è molto diverso: usiamo Volley e estendiamo semplicemente la RequetJson:
class RequestWithHeader(method: Int, url: String, body: JSONObject, listener: Response.Listener<JSONObject>, errorListener: Response.ErrorListener, val token: String) :
JsonObjectRequest(method, url, body, listener, errorListener) {
override fun getHeaders(): Map<String, String> {
return mapOf(
"Content-Type" to "application/json",
"Authorization" to token,
"Cookie" to "XDEBUG_SESSION=INTELLIJ; path=/; domain=rotor.local; Expires=Tue, 19 Jan 2038 03:14:07 GMT;"
)
}
}
Poi abilitate il remote debugging in IntelliJ e usate la vostra app come al solito. Quando chiamate una API con breakpoint, IntelliJ dovrebbe fermarsi.
Divertitevi!