Как я могу использовать 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.

Есть две части:

  1. Расширение PECL
  2. Просмотрщик пространства пользователя

Расширение 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"
Другие вопросы по тегам