Публикация

Xhprof - это специальное расширение для PHP, которое собирает для вас различные статистические данные вашего приложения: количество вызовов функции, время выполнения, последовательность выполнения, использование процессорного времени, использование памяти и т.д. Удобно использовать в высоконагруженных приложениях, чтобы отследить бреши в производительности и впоследствии устранить их. Далее ваш покорный слуга расскажет захватывающую историю установки xhprof под LEMP.

Шаги по установке и настройке профайлера.

  1. Перед установкой

    Так как я устанавливам профайлер под LEMP, у вас уже должен быть настроен Nginx и PHP 7 FPM.

  2. Загрузка и разгрузка

    git clone https://github.com/RustJason/xhprof
    git branch -b php7 origin/php7
    cd extension
    phpize
    ./configure --with-php-config=/usr/bin/php-config
    sudo make && sudo make install
    mkdir /var/tmp/xhprof
      

    Тут следует обратить внимание на то, что я использую PHP версии 7. Официальной поддержки PHP 7 от xhprof пока нет (возможно, её никогда и не будет). В этой связи я использую сторонний форк с поддержкой необходимой мне версии.

  3. Настройка php.ini

    Откройте php.ini в вашем любимом редакторе (я предпочитаю nano, т.к. даже обезьяна сможет в нём работать):

    sudo nano /etc/php/7.0/fpm/php.ini

    и добавьте следующие инструкции в конец файла:

    [xhprof]
    extension=xhprof.so
    xhprof.output_dir="/var/tmp/xhprof"
    

Вуалья! Перезагрузите PHP и проверьте вывод функции phpinfo(). Если вы смогли отыскать там новое дополнение xhprof, то всё прошло успешно.

Настраиваем профайлер и смотрим на результаты.

  1. Создаём необходимые файлы

    Создадим файлы header.php и footerp.php, которые будут подключаться в начале и конце любого скрипта. Стоит отметить, что все последующие шаги можно не выполнять. У вас есть все права подключать профайлер только для конкретного скрипта (тогда не нужно добавлять auto_prepend/append_file инструкции в php.ini).

      // header.php
      if (extension_loaded('xhprof') && $_SERVER['HTTP_HOST'] != '%YOUR_APP_HOST%') 
      {
          include_once '%YOUR_APP_FULL_PATH%/xhprof_lib/utils/xhprof_lib.php';
          include_once '%YOUR_APP_FULL_PATH%/xhprof_lib/utils/xhprof_runs.php';
          
          xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
      }
      
      // footer.php
       if (extension_loaded('xhprof') && $_SERVER['HTTP_HOST'] != '%YOUR_APP_HOST%') {
           $profilerNamespace = '%SOME-PROFILER-NAME%';
           $xhprofData = xhprof_disable();
           $xhprofRuns = new XHProfRuns_Default();
           $runId = $xhprofRuns->save_run($xhprofData, $profilerNamespace);
    
           $url = 'http://%YOUR_APP_HOST%/xhprof/xhprof_html/index.php?run=%s&source=%s';
           $profilesUrl = sprintf($url, $runId, $profilerNamespace);
           echo 'Profiler Output';
       }
      
  2. Добавьте 2 инструкции к вашему файлу

    auto_append_file = %YOUR_APP_FULL_PATH%/footer.php
    auto_prepend_file = %YOUR_APP_FULL_PATH%/header.php
     

    Само собой измените переменные обёрнутые в % на реальные значения. Например для меня %YOUR_APP_FULL_PATH% - это /var/www/html/xhprof.reverseproxy.ru

  3. Создайте хост для %YOUR_APP_HOST%

    Веб файлы профайлера находятся в папке %YOUR_APP_FULL_PATH%/xhprof_html. Именно это и должно быть корневой директорией нашего хоста:

    server {
            listen 80;
    
            root %YOUR_APP_FULL_PATH%/xhprof_html;
            index index.php;
    
            charset utf-8;
    
            server_name %YOUR_APP_HOST%;
    
            # add Strict-Transport-Security to prevent man in the middle attacks
            add_header Strict-Transport-Security "max-age=31536000";
    
            location / {
                    try_files $uri $uri/ =404;
            }
    
            location ~ \.php$ {
                    try_files $uri =404;
                    fastcgi_split_path_info ^(.+\.php)(/.+)$;
                    # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
    
                    # With php5-cgi alone:
                    #fastcgi_pass 127.0.0.1:9000;
                    # With php5-fpm:
                    fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
                    fastcgi_index index.php;
                    include fastcgi_params;
           }
    }
     
  4. Активируем наш сайт и смотрим за результатами :)

    Не забудьте перезагрузить nginx

27.04.2016 22:08 в Программирование
Автор: andymarrel 12430 0
Фотография пользователя andymarrel

andymarrel

Проектирование и создание веб приложений - это то, чем я занимаюсь. Если есть вопросы, комментарии или пожелания - вот мой электронный адрес: andrei.troskoff@gmail.com

Комментарии (0)