2014-12-17 12 views
10

Ho uno script PHP in cui, ad un certo punto, chiamo exec() su un altro script PHP. Questo funziona perfettamente bene, ma si blocca quando si utilizza il debugger XDebug in NetBeans. Questo mi sta causando tutti i tipi di problemi, in quanto non riesco a eseguire il debug dell'intera applicazione.PHP Debugger si blocca quando chiama exec ('php ...')

Ecco un esempio banale:

test1.php

<?php 

$output = array(); 
$status = 0; 
exec('echo "Running inside test 1"', $output, $status); 
exec('php ' . __DIR__ . '/test2.php', $output, $status); // Debugger hangs here 

var_dump($output); 
var_dump($status); 
?> 

test2.php

<?php 
echo "Running inside test 2" . PHP_EOL; 
?> 

Se corsa test1.php, corre a compimento e produce il uscita prevista

Se I debug test1.php, si blocca sulla riga exec ('php ...').

Ho provato questo con shell_exec e ottenere lo stesso problema. Ho anche provato l'esecuzione su un file .sh o altro eseguibile, senza problemi.

All'inizio pensavo che xdebug fosse in qualche modo collegato al nuovo processo PHP avviato da exec e bloccandolo, ma ho controllato il mio php.ini e ho xdebug.remote_autostart=off.

Sono consapevole che chiamare uno script PHP tramite exec() è uno strano modo di fare le cose; è in realtà un file PHAR fornito esternamente che stiamo eseguendo nel codice reale, ma l'esempio banale sopra ha lo stesso sintomo, quindi presumo che sia lo stesso problema.

Nel caso sia rilevante, sto usando PHP 5.5.13, Xdebug 2.2.3, Netbeans 7.3.1, Ubuntu 12.0.4.

risposta

2

Questo accade perché quando si esegue il secondo script, xdebug è già occupato, quindi il blocco degli script non viene eseguito e l'esecuzione dello script esterno non può essere proseguita.

per affrontare questo problema:

  1. commento al largo della xdebug impostazioni in php ini e controllare l'ambiente XDEBUG_CONFIG variabile non contenere alcun
  2. Iniziamo script principale con i parametri Xdebug (php -dxdebug.remote_enable = 1 -dxdebug.remote_mode = req -dxdebug.remote_port = 9000 -dxdebug.remote_host = 127.0.0.1)
  3. esec secondo script senza parametri Xdebug: exec ('php script.php')

Per eseguire il debug di script interno, avviare il primo script senza xdebug ed eseguire exec con xdebug, viceversa.