2013-04-22 20 views
12

Sono abbastanza disperato e corto di idee:punti di interruzione non ha colpito con xdebug, PhpStorm e laravel 3/mod_rewrite

Ho configurato xdebug e PhpStorm per un progetto laravel 3. Eseguendo il progetto localmente su Mac OS X Apache, PhpStorm e l'applicazione Web vengono eseguiti sulla stessa macchina. Configurato un host virtuale in modo che localhost.lt punti alla directory pubblica di Laravel.

voci Xdebug rilevanti in php.ini:

zend_extension = /usr/lib/php/extensions/no-debug-non-zts-20090626/xdebug.so 
[xdebug] 
xdebug.idekey="PHPSTORM" 
xdebug.remote_enable=1 
xdebug.profiler_enable=1 
xdebug.remote_log=/var/log/xdebug_remote.log 
xdebug.remote_connect_back=1 

confermato che l'estensione viene caricato.

Configurare una configurazione di debug/esecuzione di applicazioni Web PHP senza mappature dei percorsi poiché nulla è simulato e le cartelle sul server Web e PhpStorm sono esattamente uguali (poiché il server Web si trova sulla stessa macchina).

Quando si lancia tramite "Debug" dall'IDE, xdebug_remote.log mostra correttamente il punto di interruzione abbiamo impostato in uno dei file di applicazione/biblioteche:

<- breakpoint_set -i 5 -t line -f 
file:///Users/RalfR/src/livetime/application/libraries/LiveTime.php -n 676 
-> 
<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="breakpoint_set" transaction_id="5" id="9230016"></response> 

Tuttavia, quando si fa clic su un link che richiama la funzione dalla libreria LiveTime.php, il punto di interruzione NON viene colpito. Il registro mostra:

<- stack_get -i 6 -> 
<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="stack_get" transaction_id="6"><stack where="{main}" level="0" type="file" filename="file:///Users/RalfR/src/livetime/public/index.php" lineno="14"></stack></response> 

<- run -i 7 -> 
<response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" command="run" transaction_id="7" status="stopping" reason="ok"></response> 

<- run -i 8 
Log closed at 2013-04-22 21:03:57 

Come molti quadri, laravel utilizza mod_rewrite di .htaccess a tutto tubo attraverso pubblico/index.php. Che questa sia la causa per PhpStorm/xdebug che non cattura il breakpoint in application/libraries/LiveTime.php come sembra a xdebug che lo script LiveTime.php non venga mai eseguito?

Se sì, come possiamo risolvere questo problema?

+0

Inoltre, xdebug_break(); funziona sempre, quindi non è correlato a un ambiente PHP mal configurato. – Ralf

+0

Mi piacerebbe anche sapere la risposta a questo! – kreeves

+0

Ho esattamente lo stesso problema, solo io sto usando Symfony e si rompe in alcuni file ma non in altri. xdebug_break(); funziona ovunque – greg

risposta

8

È necessario impostare Path Mappings Non è necessario impostarlo per ciascun file. Per risolvere il mio problema, sono passato a IntelliJ (lo stesso per PHPStorm) Preferenze> PHP> Server .. ho selezionato il mio server e impostato quanto segue (vedi nota 2 sotto):

enter image description here

NOTA 1: avrei potuto anche impostare il percorso direttamente alla radice del progetto, ma poiché non sono interessato a eseguire il debug di qualcosa di diverso dalla mia cartella "pubblica" di Laravel e dalla mia applicazione, ho impostato solo i percorsi per queste 2 cartelle. Dopo questo tutto ha funzionato perfettamente.

NOTA 2: L'immagine mostrata sopra non proviene dalla finestra di dialogo "Impostazioni" a cui si fa riferimento nei passaggi precedenti, ma piuttosto dalla finestra di dialogo "Resovle Path Mapping Problem" che presenta lo stesso widget di mappatura mappa che funziona allo stesso modo modo. Riparazioni le impostazioni in entrambe le posizioni funzioneranno. La finestra di dialogo Risolvi problemi di mappatura dei percorsi apparirà se non hai le impostazioni di debug del server per iniziare e l'IDE rileva un problema di mappatura, a quel punto creerà anche le impostazioni del server per te.

+0

Inoltre, un'altra cosa che ho notato è che a volte, non è possibile avere lo stesso file nell'IDE come sul server durante il debug in remoto. Ho la mia configurazione IDE per copiare automaticamente il file che viene salvato, fino all'host remoto, ma questo non sempre funziona. Quindi lancio semplicemente un caricamento di file, riprovo e funzionerà. Questo spiega perché a volte alcuni file eseguono il debug e altri no. Il file che non esegue il debug è diverso da quello sull'host remoto. –

+0

Un'ultima cosa .. alcune linee di interruzione non funzioneranno affatto. Ad esempio, se i blocchi 'if'' else' non sono racchiusi tra parentesi graffe, non è possibile che il codice passi tra le parentesi graffe e si interrompa per i punti di interruzione. –

+0

la tua soluzione era vicina ma non funzionava abbastanza per me. invece ho mappato la cartella www del mio progetto su/var/www nelle impostazioni di PHPStorm> Server. – dwenaus

0

Nel mio caso, la causa del problema "breakpoint_set"/"command is not available" era disabilitata l'opzione xdebug.extended_info (è abilitata di default ma l'ho disabilitata per la profilazione).
I punti di interruzione non funzionano, quindi xdebug.extended_info è disabilitato.
Sono stati risolti i punti di interruzione dopo la riattivazione di xdebug.extended_info.

0

Per coloro che utilizzano Netbeans e Laravel, è necessario impostare "Web Root" come cartella pubblica che si trova nel progetto-> Proprietà-> Fonti.

Edit web root in Netbeans