Как я могу использовать XHProf для профилирования тестов PHPUnit из командной строки?
У меня есть несколько очень медленных тестов PHPUnit (8 минут для 43 тестов), и мне нужно использовать XHProf, чтобы выяснить, что происходит не так.
Как я могу сделать это из командной строки? У меня есть PHPUnit в каталоге проекта /vendor, загруженный через композитор.
3 ответа
Чтобы узнать, какие тесты работают медленно, вы можете использовать
Установите прослушиватель через Composer, а затем включите его в phpunit.xml, например
<phpunit bootstrap="vendor/autoload.php">
...
<listeners>
<listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener" />
</listeners>
</phpunit>
Чтобы узнать, почему тесты работают медленно, вы можете использовать
Вы можете настроить его в phpunit.xml, например
<listeners>
<listener class="PHPUnit_Util_Log_XHProf" file="PHPUnit/Util/Log/XHProf.php">
<arguments>
<array>
<element key="xhprofLibFile">
<string>/var/www/xhprof_lib/utils/xhprof_lib.php</string>
</element>
<element key="xhprofRunsFile">
<string>/var/www/xhprof_lib/utils/xhprof_runs.php</string>
</element>
<element key="xhprofWeb">
<string>http://localhost/xhprof_html/index.php</string>
</element>
<element key="appNamespace">
<string>Doctrine2</string>
</element>
<element key="xhprofFlags">
<string>XHPROF_FLAGS_CPU,XHPROF_FLAGS_MEMORY</string>
</element>
<element key="xhprofIgnore">
<string>call_user_func,call_user_func_array</string>
</element>
</array>
</arguments>
</listener>
</listeners>
Дополнение ответа @ Гордона относительно xhprof.
Есть две части:
- Расширение PECL
- Просмотрщик пространства пользователя
Расширение PECL добавляет методы в движок PHP для сбора метрик. Вы должны установить это расширение.
Средство просмотра пользовательского пространства предоставляет веб-интерфейс для понимания вывода коллекции метрик. Вам это не нужно, но вы действительно этого хотите. Если вам не нравится смотреть на необработанные метрические данные. Чтобы установить и настроить средство просмотра пользовательского пространства, чтобы PHPUnit мог профилировать ваши тесты:
(1) Добавьте эти пакеты в свой composer.json
:
composer require "facebook/xhprof:dev-master@dev" --dev
composer require "phpunit/test-listener-xhprof:1.0.*@dev" --dev
(2) Настройте свой веб-сервер для обслуживания каталога vendor/facebook/xhprof/xhprof_html/. Запомните URL.
(3) Адаптируйте вашу существующую конфигурацию PHPUnit в phpunit-xhprof.xml
это похоже на это. Убедитесь, что вы изменили "appNamespace", чтобы он соответствовал вашему коду, и измените "xhprofWeb" на URL-адрес с шага 2:
<phpunit>
<testsuites>
<testsuite name="All Tests">
<directory suffix="Test.php">tests/</directory>
</testsuite>
</testsuites>
<listeners>
<listener class="PHPUnit\XHProfTestListener\XHProfTestListener" file="vendor/phpunit/test-listener-xhprof/src/XHProfTestListener.php">
<arguments>
<array>
<element key="appNamespace">
<string>App</string>
</element>
<element key="xhprofWeb">
<string>http://localhost/vendor/facebook/xhprof/xhprof_html/index.php</string>
</element>
<element key="xhprofLibFile">
<string>./vendor/facebook/xhprof/xhprof_lib/utils/xhprof_lib.php</string>
</element>
<element key="xhprofRunsFile">
<string>./vendor/facebook/xhprof/xhprof_lib/utils/xhprof_runs.php</string>
</element>
<element key="xhprofFlags">
<string>XHPROF_FLAGS_CPU,XHPROF_FLAGS_MEMORY</string>
</element>
<element key="xhprofIgnore">
<string>call_user_func,call_user_func_array</string>
</element>
</array>
</arguments>
</listener>
</listeners>
</phpunit>
(4) Запустите PHP и соберите статистику: phpunit -c ./phpunit-xhprof.xml
Вы увидите вывод, похожий на следующий:
* BishopB\Pattern\Exception\InvalidArgumentTest::test_hierarchy
http://localhost/vendor/facebook/xhprof/xhprof_html/index.php?run=556e05cec844c&source=BishopB\Pattern
Это URL, который вы настроили для просмотра результата запуска. Если вы хотите просмотреть необработанные данные метрик, найдите этот ключ запуска (в данном примере "556e05cec844c") во временном каталоге:
$ ls -l /tmp/556e05cec844c.BishopB\\Pattern.xhprof
-rw-rw-r-- 1 bishop staff 16963 Jun 2 15:36 /tmp/556e05cec844c.BishopB\Pattern.xhprof
Убедитесь, что вы добавили строки xdebug в ваш файл php.ini, а не только в apache php.ini. В Ubuntu он находится по адресу /etc/php5/cli/php.ini. Вы должны добавить эти строки в файл: zend_extension = / usr / lib / php5 / 20100525 + lfs / xdebug.so xdebug.profiler_enable = 1 xdebug.profiler_output_dir = / path / to / output_dir xdebug.profiler_output_name = cachegrind.ache.% т
РЕДАКТИРОВАТЬ: Ой, вы правы, я думал об использовании cachegrind. Строки, которые нужно добавить, будут ниже, но моя главная мысль такая же. Убедитесь, что вы посмотрите на cli php.ini.
[xhprof]
extension=xhprof.so
xhprof.output_dir="/var/tmp/xhprof"