Отладчик PHP зависает при вызове exec ('php...')

У меня есть PHP script, в котором в какой-то момент я вызываю exec() на другом PHP скрипт. Это работает отлично, но он зависает при использовании отладчика XDebug в NetBeans. Это вызывает у меня всевозможные проблемы, поскольку я не могу отладить все приложение.

Вот тривиальный пример:

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;
?>

Если я запустил test1.php, он завершится и выдает ожидаемый результат.

Если я отлаживаю test1.php, он зависает в строке exec ('php...').

Я пробовал это с помощью shell_exec и получал ту же проблему. Я также попробовал exec'ing в .sh файле или другом исполняемом файле без каких-либо проблем.

Сначала я подумал, что xdebug каким-то образом присоединяется к новому процессу PHP, который запускается exec и блокирует его, но я проверил свой php.ini и имел xdebug.remote_autostart=off.

Я знаю, что вызов PHP script через exec() - странный способ делать вещи; это фактически внешний файл PHAR, который мы исполняем в реальной кодовой базе, но тривиальный пример выше имеет тот же самый симптом, поэтому я предполагаю, что это та же проблема.

В случае, если это имеет значение, я использую PHP 5.5.13, Xdebug 2.2.3, Netbeans 7.3.1, Ubuntu 12.0.4.

Ответ 1

Это происходит потому, что, когда вы выполняете второй script, xdebug уже занят, поэтому нет script киосков, а выполнение внешнего script не может быть продолжено.

Чтобы решить эту проблему:

  • отмените настройки xdebug в php ini и проверьте переменную среды XDEBUG_CONFIG, чтобы она не содержала
  • запустите main script с параметрами xdebug (php -dxdebug.remote_enable = 1 -dxdebug.remote_mode = req -dxdebug.remote_port = 9000 -dxdebug.remote_host = 127.0.0.1)
  • exec второй script без параметров xdebug: exec ('PHP скрипт.php')

Чтобы отладить внутренний script, сначала начните script без xdebug, а exec с xdebug, наоборот.