Как запустить профилировщик XDebug для PHP-скрипта из командной строки?

195

XDebug предлагает директиву конфигурации «xdebug.profiler_enable_trigger», которая позволяет активировать профилирование, передавая параметр GET или POST «XDEBUG_PROFILE» при вызове скрипта через HTTP. Это удобно, если вы не хотите выполнять профилирование для ВСЕХ ваших сценариев, но только для нескольких особых случаев без постоянного изменения конфигурации PHP.

Есть ли способ добиться того же поведения для программ PHP командной строки? Я пытался передать «XDEBUG_PROFILE» в качестве аргумента командной строки, но это не сработало.

В общем, профилирование командной строки PHP работает хорошо, но я бы хотел иметь такую ​​же гибкость для каждого вызова, как и в браузере и HTTP-сервере.

Какие-либо предложения?

selfawaresoup
источник
Извините, я тоже пробую это, но не понимаю. Что должно быть в параметре "XDEBUG_PROFILE"?
Андреш Серж
Неважно, что находится в параметре, пока он присутствует вообще.
selfawaresoup
Отсутствие поддержки переменной среды XDEBUG_PROFILE - ошибка 413 в трекере ошибок XDebug.
13

Ответы:

258

Вы можете передать параметры INI с -dфлагом: php -d xdebug.profiler_enable=On script.php.

Jou
источник
39
В системах на основе * Никс, вы можете сделать это немного проще в использовании, создавая псевдоним, например: alias phpp="php -d xdebug.profiler_enable=1". Таким образом, когда вы не хотите, чтобы профиль просто использовать phpи когда вы используете phpp.
JC Yamokoski
14
Я должен был указать , какой каталог я хотел вывод профилировщика быть сохранен как хорошо, так что это woked для меня alias xphp="php -d xdebug.profiler_enable=On -d xdebug.profiler_output_dir=.". Это всегда сохраняет выходные данные отладки в вашем текущем рабочем каталоге.
Ларс Нистрем
да, я нахожусь под Eclipse и XAMPP в среде Win7. Оно работает.
gouchaoer
4
В Windows вы можете создать в директории PATH phpp.cmdфайл, в котором php -d xdebug.profiler_enable=On %*вы можете просто запустить phpp <args>.
Двойной Гра
43

Я получил эту работу на Ubuntu / Netbeans:

  • скопировать строки конфигурации xdebug из файла /etc/php5/apache2/php.ini в /etc/php5/cli/php.ini
  • установив переменную среды с именем сеанса отладки (вы можете получить это из строки запроса в URL-адресе страницы, запускаемой netbeans при запуске отладки), команда: export XDEBUG_CONFIG = "idekey = netbeans-xdebug"

Тогда это просто случай запуска отладки в netbeans и выполнения «php myscript.php» в командной строке.

Эндрю Хэнкокс
источник
2
Примечание. После того, как вы закончите, если вы хотите, чтобы ваш отладчик слушал и не запускал его с помощью команды PHP, вы можете просто использовать: «unset XDEBUG_CONFIG».
Дан Ламанна
Это на самом деле работает для меня, в то время как ответ выше не ;-)
Джонатан Лиути
4
Это касается отладки (пошаговое выполнение скрипта). Вопрос был о профилировании (анализ производительности скрипта, какие функции занимают много времени и т. Д.)
Мэтью Флэшен
32

с PhpStorm на удаленном веб-сервере я использую эту команду:

XDEBUG_CONFIG="idekey=PHPSTORM" PHP_IDE_CONFIG="serverName=server_name" php -dxdebug.remote_host=`echo $SSH_CLIENT | cut -d "=" -f 2 | awk '{print $1}'` myscript.php

где server_nameобозначает имя сервера в конфигурации PhpStorm проекта

Оливер Надж
источник
5
я добавил это в .bash_aliases alias xphp="XDEBUG_CONFIG="idekey=PHPSTORM" PHP_IDE_CONFIG="serverName=example.com" php -d memory_limit=1G -d xdebug.remote_host=echo $ SSH_CLIENT | cut -d \ "= \" -f 2 | awk '{print $ 1}', "поэтому, когда я хочу отладить, я использую xphp вместо php
oliver nadj
19

Как описано на странице удаленной отладки Xdebug , профилирование также можно включить с помощью XDEBUG_CONFIGпеременной среды, включив директиву profile_enable = 1:

XDEBUG_CONFIG="profiler_enable=1" php ...
outis
источник
Это должен быть принятый ответ, так как это самый доступный метод. Бинарный файл PHP может быть упакован, он может быть установлен как интерпретатор #! / X / php в местах, которые вы не хотите трогать. Используя переменную env, она может быть выборочно включена
John
11

Подобный, но другой процесс для того, чтобы заставить его работать с Netbeans при разработке на виртуальной машине.

Необходимо передать флаг удаленного включения, флаг автоматического запуска, флаг ide и имя вашего удаленного хоста.

php -dxdebug.remote_enable=1 -dxdebug.remote_autostart=On -dxdebug.idekey=netbeans-xdebug -dxdebug.remote_host=NAME.OF.HOST script.php
Джошуа Дэнс
источник
4

Я создал сценарий оболочки для обработки отладки клиента.

имя скрипта: phpdebug

#!/usr/bin/ksh
php -dxdebug.remote_host=`echo $SSH_CLIENT | cut -d "=" -f 2 | awk '{print $1}'` $*

Я поместил этот скрипт в /usr/bin и дал ему разрешения на выполнение.

Сценарий принимает аргументы, переданные в phpdebug, и вызывает php с аргументами xdebug и добавляет аргументы, переданные в сценарий оболочки, $ * в конце.

user2970583
источник
Да, в любом случае, все, что мне было нужно, это добавить настройку INI для моего удаленного хоста. Это было все, что требовалось для отладки в моей IDE с помощью команды CLI PHP.
Спенсер Уильямс
На самом деле, мне также нужно было установить XDEBUG_CONFIGпеременную окружения. Только это и xdebug.remote_hostнастройка заставили это работать.
Спенсер Уильямс
2

В PhpStorm 7 с использованием WAMP я заставил это работать, скопировав мои уже работающие настройки xdebug из C: \ wamp \ bin \ apache \ apache2.2.22 \ bin \ php.ini в раздел xdebug C: \ wamp \ bin \ php \ phpX.YZ \ php.ini. Затем я запустил свой скрипт так:

php -d xdebug.idekey=PHPSTORM script.php

Это даже работало для отладки скриптов Laravel Artisan.

php -d xdebug.idekey=PHPSTORM artisan db:seed --force
Чукки Нзе
источник
0

Документация от Jetbrains

Чтобы запустить сценарий с отладкой с помощью переключателей командной строки PHP Установите переменную среды, которая сообщит XDebug о подключении к IDE:

Windows / MacOS / Linux

export XDEBUG_CONFIG="idekey=123"  

Здесь idekey должен иметь случайное значение.

Запустите PHP со следующими параметрами командной строки:

php -dxdebug.remote_enable=1 -dxdebug.remote_mode=req -dxdebug.remote_port=9000 -dxdebug.remote_host=127.0.0.1 -dxdebug.remote_connect_back=0 path/to/script.php

Вы можете использовать 10.0.2.2 вместо 127.0.0.1 с Vagrant (см. Соответствующий вопрос SO).

adm1n
источник