Інше

Точний profile php id. XHProf та xDebug - профільування (profiling) коду PHP. Займіться улюбленою справою

Профілювання програми — це збір даних про швидкість виконання різних ділянок програми (файлів та функцій). Існує безліч інструментів профілювання PHP, але не всі інструменти підходять для аналізу прямо в продакшні.

XHProf- Мега простий профайлер, який збирає статистику прямо під час роботи програми майже без верхівки.

Навіщо профільувати?

Якщо програма починає працювати повільно, профіль допоможе дізнатися, яка саме частина тупить. Результат профілювання - це зазвичай список виконаних функцій та часу їх виконання.

Профілювання варто робити до будь-якої оптимізації програми. Інакше — керуватиметеся здогадками. Швидше за все неправильними.

Проблема Xdebug

Xdebug – потужне рішення для PHP. Але сама платформа Xdebug настільки тяжка, що її не можна використовувати на працюючих сайтах. XDebug створює значне навантаження на ресурси сервера та уповільнює програму.

З іншого боку, проблеми на "живому" сайті можуть бути зовсім не такими, як серед розробника. Профілювання тільки на комп'ютерах розробників показуватиме лише частину проблем.

Саме тому і було розроблено рішення XHprof. Воно призначене для застосування у працюючих додатках. Основна ідея цього профайлера - створювати мінімум навантаження на додаток, при цьому збирати всі необхідні дані про швидкість роботи. Рішення розроблено хлопцями з Facebook та підтримується новими версіями PHP.

XHProf

Встановлення

На Debian XHprof є у sid пакетах, тому: apt-get install xhprof

Ви також можете зібрати XHprof самостійно.

Увімкнення профілювання

Нехай у нас є скрипт із таким кодом:

execute();

Проведемо профіль за допомогою XHprof. Для цього на цій сторінці необхідно:

  1. Включити профайлер на початку.
  2. Наприкінці програми зупинити профайлер і зберегти отримані дані.

Це буде виглядати так:

# Ініціалізуємо профайлерxhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); # Виконуємо програму після включення профайлера execute(); # Зупиняємо профайлер після виконання програми$xhprof_data = xhprof_disable();

# Зберігаємо результат профілювання в змінну $xhprof_data

  • Функція xhprof_enable()приймає як аргументи прапори. XHPROF_FLAGS_CPU для фіксації статистики процесора, XHPROF_FLAGS_MEMORY – для пам'яті, XHPROF_FLAGS_NO_BUILTINS – для ігнорування вбудованих функцій.
  • xhprof_disable()вимкне профайлер і поверне зібрану статистику.

Звіти

Генерація

Зібрані дані можна проаналізувати в інтерфейсі XHprof для побудови звітів. Для цього необхідно скачати вихідні коди XHprof : cd /var/www; wget http://pecl.php.net/get/xhprof-0.9.4.tgz gzip -d xhprof-0.9.4.tgz tar -xvf xhprof-0.9.4.tar

Після цього необхідно внести зміни до скрипту:

include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php"; include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = новий XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "test");

# Новий код зберігає звіт для використання у графічному інтерфейсі

Інтерфейс для звітів

Щоб побачити звіт, необхідно налаштувати віртуальний хост на папку /var/www/xhprof-0.9.4/xhprof_html. Наприклад, у Nginx:

Server (server_name xh..9.4/xhprof_html; index index.php; location ~* \.(php)$ ( fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT nginx -s reload

Після цього з'явиться список звітів:

Таблиця містить перелік функцій, які були виконані в рамках однієї сторінки з додатковою інформацією:

  • Calls — кількість та відсоткове співвідношення дзвінків функції.
  • Incl. Wall Time — час виконання функції із вкладеними функціями.
  • Excl. Wall Time – час виконання функції без вкладених функцій.
  • Incl. CPU - процесорний час із вкладеними функціями.
  • Excl. CPU – процесорний час без вкладених функцій.
  • Incl. MemUse – використання пам'яті з вкладеними функціями.
  • Excl. MemUse – використання пам'яті без вкладених функцій.
  • Incl. PeakMemUse – максимальне споживання пам'яті з вкладеними функціями.
  • Excl. PeakMemUse – максимальне споживання пам'яті без вкладених функцій.

Графічні звіти

Щоб створити графічний звіт, переконайтеся, що у Вас встановлений graphviz: apt-get install graphviz

Ресурсоємні ділянки коду виділені жовтим (середні) та червоним (найважчі). Це ті ділянки коду, які використовують безліч ресурсів щодо решти програми. Це може бути одна повільна функція або велика кількість швидких викликів. У нашому прикладі функція str_replace()позначена червоним через 262 дзвінки.

Агрегатні звіти

Інтерфейс XHprof також дозволяє переглядати агрегатну інформацію відразу з кількох звітів. Для цього run_id передаються через кому: http://xh..php?run= 53a894f6d5d9b,53a894fcf126e&source=test

TL; DR

Використовуйте XHprof для профілювання PHP прямо у продакшні.

За допомогою систем для профілювання можна зібрати інформацію про те, які функції у php-коді споживають більше процесорного часу та оперативної пам'яті, тобто виявити найбільш повільні та вимогливі до пам'яті місця у програмі на php.

xhprof

XHProf - PHP profiler розроблений у Facebook.

Встановлення:

Aptitude install php-pear pecl install xhprof-0.9.4 echo "extension=xhprof.so" > /etc/php5/mods-available/xhprof.ini ln -s /etc/php5/mods-available/xhprof.ini /etc /php5/conf.d/xhprof.ini apachectl restart

Необхідні для роботи файли розташовані у директорії /usr/share/php. Однак не всі, а лише з php-кодом. Для нормального відображення звітів потрібні jquery та css. Їх можна отримати з репозиторію на github:

Git clone https://github.com/facebook/xhprof.git

Після цього код php-скрипта в місці, звідки має початися збір даних додаємо рядок:

Xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

У дужках вказані параметри збору даних. В даному випадку буде здійснюватися збір даних щодо навантаження на процесор та використання оперативної пам'яті. Можливий ще один параметр XHPROF_FLAGS_NO_BUILTINSпри використанні якого дані щодо вбудованих функцій не збираються.

$xhprof_data = xhprof_disable(); include_once "xhprof_lib/utils/xhprof_lib.php"; include_once "xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = новий XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_test"); echo "Report: http://domain.tld/xhprof_html/index.php?run=$run_id&source=xhprof_test"; echo "\n";

У рядку $run_idу лапках зазначено назву профілю, яку можна задати довільно.

Результат в обробленому вигляді має такий вигляд:

Якщо вказати параметр XHPROF_FLAGS_NO_BUILTINS, то видно, що кількість викликів функцій значно знижується:

У таблиці представлена ​​така інформація:

Calls- кількість дзвінків функції,
Wall Time- загальний час роботи функції, включаючи час очікування відповіді від зовнішніх ресурсів,
CPU- скільки часу було затарчено на обробку функцій,
MemUse- скільки оперативної пам'яті було задіяно,
PeakMemUse- пікове споживання пам'яті.

Як модифікатори виступають:

Incl- inclusive - з урахуванням викликів інших функцій цієї функції,
Excl- exclusive – без урахування викликів функцій.

Крім того, над таблицею представлена ​​інформація про сумарні часи обробки, використану пам'ять і кількість викликів функцій.

Також XHProfдозволяє будувати різницеві звіти між двома запусками, які позначаються червоним та зеленим кольорами. За допомогою таких звітів можна отримати ясну картину покращень після кожної зміни коду.

Для отримання подібного звіту потрібно скористатися посиланням:

http://domain.tld/xhprof_html/index.php?run1=run_id1&run2=run_id2&source=xhprof_test

де run_id1і run_id2- Ідентифікатори запусків.

Якщо встановити Graphviz:

Aptitude install graphviz

Також для php profiler xhprof існують сторонні веб-інтерфейси, що використовують бази даних:

xDebug

xDebug- дебаггер PHP-коду з можливістю профілювання (profiling), написаний Деріком Ретансом (Derick Rethans).

Встановлення:

Yum install php5-xdebug

Потім редагуємо конфіг:

Nano /etc/php5/mods-available/xdebug.ini

додаючи до нього рядки:

Xdebug.profiler_enable = 1 xdebug.profiler_aggregate = On xdebug.profiler_output_dir = /tmp

Тут включаємо PHP профайлер і вказуємо директорію, в яку складати профілі. Профілі створюються з іменами виду cachegrind.out.*

Існує веб-клієнт webgrind: https://github.com/jokkedk/webgrind. Працює не надто швидко, але дозволяє оперативно переглянути невеликі профілі. Фактично це код на PHP, який потрібно схилювати з github:

Git clone https://github.com/jokkedk/webgrind.git

створиться директорія webgrind, яку потрібно скопіювати в директорію будь-якого сайту та звернутися до неї із браузера. Далі, щоб у Debian запрацювала побудова графіків у конфігураційному файлі config.phpпотрібно виправити шлях до виконуваного файлу graphviz. Повинно вийти так:

Static $dotExecutable = "/usr/bin/dot";

Крім того, можна підправити часовий пояс:

Static $defaultTimezone = "Europe/Moscow";

У заголовку можна вибрати профіль і поставити галочку чи враховувати вбудовані функції. У самій таблиці видно функції, кількість викликів, час роботи функції і час з урахуванням очікування. Щоб заглибитись у функції достатньо клацнути по трикутній стрілочці. У моєму випадку при досить об'ємних профілях (від кількох мегабайт), очікування на результат було надмірно великим. Мабуть, для досить великих профілів краще використовувати локальні програми просмору.

Графік може виглядати так:

Зверніть увагу, що webgrindне варто використовувати на виробничих серверах, оскільки будь-яка авторизація не передбачена, але при цьому є доступ до коду файлів на php. У разі потреби використовуйте хоча б базову авторизацію Apache.

Також існують програми для аналізу профілів як під Linux:

Про профільування

Дані профілю можуть допомогти вам покращити вашу програму, тобто досягти певних цілей, наприклад, знизити споживання пам'яті, зменшити час генерації сторінки і так далі.

Інформація у профілі є стартовою точкою в оптимізації: повідомляється скільки часу генерується результат, скільки використовується пам'яті і скільки викликів функцій відбувається. За допомогою докладніших даних ви можете покращити ці показники.

Наприклад, якщо ви використовуєте фреймворк, використання деяких функцій фреймворку може вести до виклику декількох базових функцій. Якщо ви читаєте деякі дані кілька разів, можливо, варто зберегти результат в змінну.

Також профайлер може допомогти зрозуміти де варто використовувати кешування PHP-коду, наприклад, за допомогою APCuабо memcached.

Насамперед, варто оптимізувати функції, які вимагають найбільше часу на виконання. Після того, як все оптимізовано і здається, що покращувати більше нічого, варто відсортувати функції за кількістю викликів та попрацювати над його зниженням. Навіть якщо PHP працює швидко, варто подумати, чи потрібно викликати функції так часто?

При виявленні наступних ситуацій варто подумати про кешування:

  • Незмінні функції викликаються всередині циклу,
  • Якийсь вміст генерується двічі,
  • Вміст, який не змінюється генерується щоразу,
  • Вміст генерується навіть якщо не використовується.

Не варто кешувати все поспіль, оскільки пам'ять також цінний ресурс. Кешуйте ті дані, до яких звертаєтеся постійно. Також кешування має мало сенсу, якщо кешування витрачає більше ресурсів, ніж економить.

Крім кешування в коді не варто забувати про кешування за допомогою веб-сервера (), а також на стороні клієнта. Якщо використовувати правильні заголовки, багато запитів можуть бути дозволені ще до надходження на сервер.

Сигналізують про те, що людина «провалилася».

Багато людей взагалі цього не помічають.

«Бетонна плита» на їх голові здається настільки звичною і знайомою, що вони сприймають перехід у стан, що творить — коли вони сповнені сил і почуваються всемогутніми і єдиними з усім сущим — як щось незвичайне… для них це найсильніший прорив.

Адже це природний стан людини?!

Тому, коли ви:

КРОК ДО СЕБЕ. Виклик щодня

Не знаєте, як навчитися Любити Себе?

Отримайте 14 вправ, які допоможуть вам прийняти себе і ваше життя у всій його повноті!

Натискаючи кнопку «Миттєвий доступ», ви даєте згоду на обробку ваших персональних даних та погоджуєтесь з

  • Впадаєте в саможаль
  • Часто відчуваєте поганий настрій
  • Почуваєте себе маленькими та нікчемними
  • Ідіть на поводу емоцій
  • Дієте «на автоматі»
  • Не хочеться вставати вранці
  • Зіткнетесь з постійними перешкодами
  • Почуваєтеся безсилими

можна з упевненістю сказати, що ви провалилися.

І перший крок на шляху «зцілення» - Побачити та усвідомити, що ви випали ... випали зі звичного творить стану.

Чим швидше ви зробите це, тим швидше вживіть заходів, щоб повернутися до себе!

Якщо ви "провалилися" - Як вибратися з 3D ями

Як тільки ви усвідомили, що це не світ навколо вас раптом став сірим і похмурим, а ви самі почали сприймати його таким, ваше основне завдання - ПЕРЕМИКАТИСЯ.

Зробити це можна по-різному:

1. Увімкніть музику, яка надихає вас

Роздратування, втома, поганий настрій створюють навколо вас кокон низьковібраційної енергії.

Зберіть свою колекцію треків та композицій, які дозволять вам співналаштуватися з вищою вібрацією.

Що може бути простіше, ніж включити улюблені композиції у плеєрі та займатися звичними справами!

Зазвичай у такому стані тягне на щось меланхолійне і навіть упадницьке, під настрій… Терміново перемикайтеся!

Я сама в такі моменти включаю Алілуйю у виконанні Анастасії Добровольської)))

Коли ви провалюєтесь, ви почуваєтеся відокремленими, ніхто вас не цінує і не розуміє. Усередині розростається гіркота та саможаль.

У цей момент ваше серце закривається важкою бронею, покликаною захистити вас.

Неможливо увійти в стан, що творить, із закритим серцем!

Значить, ваше завдання відновити власну чутливість. Це можна зробити за допомогою медитативних практик (див. параграф 6).

Або поєднати користь та задоволення за переглядом гарного фільму.

Комедії не підійдуть. Потрібен фільм, який торкнеться вашої душі і змусить вас співпереживати!

Наприклад, ці:

3. Пориньте в яскраві враження

Ваша душа живиться яскравими фарбами. Подаруйте їй це. Навіть через "не хочу"!

Виберіться з дому. пройдіться магазинами, галереями, музеями. У реалі чи віртуально (можливості інтернету дозволяють це).

Особисто мене надихають вогні нічного міста.

А вчора вночі ми потрапили в казку: на вулиці був туман, і ми вирішили доїхати до моря ... Шелесті хвиль, молочний туман навколо, і світло ліхтариків, що зачаровує ... повний сюр. Жаль техніка не може передати цю красу.

4. Займіться улюбленою справою

Коли ви поринаєте в те, що любите робити, нав'язливі думки, сумніви та питання відходять на задній план.

Ви активізуєте у собі творчий початок і ТВОРИТЕ.

Можливо, у вас не відразу вдасться зловити драйв від того, що ви робите… головне, не зупиняйтесь на півдорозі. Це ваш ресурсний стан, і ви знаєте про це.

Тому не відкладайте на потім, виділіть час на те, щоб із пристрастю поринути у улюблену справу.

5. Усамітніться на природі

Природа не має поганої погоди, не має поганого настрою. Природа дозволяє вам збалансуватись природним чином.

Навіть якщо ви поїдете на прогулянку всією сім'єю, попросіть вас хвилин 10 не чіпати. Відійдіть убік, прислухайтеся до шуму вітру, до скрипу дерев, доторкніться до шорсткої кори. Вдивіться в небо. Вберіть рівновагу природи кожною клітиною.

Після того, як ви переключили свою увагу, приходить черга наступного кроку. Тепер ви більш менш збалансовані і можете виконати прості практики, які підтримають вас у поверненні у ваш звичний стан.

Підійдуть будь-які методи гармонізації та балансування, практики для розкриття серця та вибудовування вертикального каналу Духа, а також енергетичні практики для підвищення рівня вашої енергії.

6. Розкрийте ваше Серце

Ваші образи, претензії, агресія на себе та самокритика крапля за краплею перекривають енергетичні канали вашого серця.

7. Просіть благословення та підтримки вашого Вищого Я

У момент провалу ви почуваєтеся маленьким чоловічком, таким звичайним і безпосереднім, що швидше за все забуваєте, що ви — це не тільки ваше тіло, ваші думки та почуття.

Ви забуваєте, що існує мудріша і просунута частина вас — ваше Вище «Я», яке не втручається у ваше життя доти, доки ви НЕ попросітьпро це.

Отже, «Просіть і дано вам буде»!

Якщо ви ніколи не зустрічалися/не спілкувалися з цією частиною вас, медитація допоможе вам у цьому.

8. Вибачте себе за провал

Щоб не стало причиною вашого стану, знайте, що ви підсвідомо вважаєте себе відповідальним, а тяжкому випадку і винним за те, що сталося.

Техніка очищення Хоопонопоно складається з чотирьох етапів: Мені дуже шкода. Вибач мені. Дякую тобі. Кохаю тебе.

Багато років тому, коли мій світ, як мені здавалося, валився у мене на очах, у голові виникли фрази:

Я прощаю тебе. Я дякую тобі. Я відпускаю тебе з коханням.

Кілька годин поспіль я як мантру вимовляла їх вголос, а потім зрозуміла, що забула важливий елемент і додала: Я прощаю себе!

Вибачте СЕБЕ за цей досвід. Подякуйте СЕБЕ за нього. І відпустіть із любов'ю.

9. Виконайте Пісня Подяки

З цією піснею пов'язаний містичний досвід багатьох людей. Щоб це спрацювало для вас, важливо виконати 3 умови: 1) усамітнитися хвилин на 15, щоб вас ніхто не відволікав, і ви відчували себе розкуто; повну силу.

Алілуя - пісня подяки. За все, що було і є у вашому житті.

Впіймайте настрій цієї композиції і не соромтеся співати так, як умієте і виходить. Ваш голос сам збудується з потрібною вібрацією.

А оскільки горловий центр відповідає за ваше самовираження в цьому світі, ви вихлюпує з себе не тільки подяку, але й виражаєте те, хто ви є, по суті, без масок, претензій і провалів.

Спробуйте! Ви не пошкодуєте!

P.S. Пропоную в коментарях викласти назву фільмів, які торкнулися вашої душі (від музичних треків теж не відмовимося).

P.P.S. Буду вдячна, якщо поділіться посиланнями на улюблені ролики на Youtube, мій запас вже добігає кінця ((

Profile data loop is most complex від всіх custom BuddyPress loops. Це фактично два промені в одному, перший є прорив через профільні поля групи, і на другий прорив через прорізні поля в цьому розділі групи.

Standard Loop

Цей користувач не має profilu.

Accepted Parameters

bp_group_has_profile() функція буде прийнята за числом параметрів, які будуть спрямовуватися на data being returned.

  • profile_group_id optional

    By default all groups and all fields will be displayed. Якщо ви наведені в ID групи польових груп, то тільки польові поля в цій групі будуть розгорнуті.

    • Default value: false
  • user_id optional

    ID ID user you want to fetch the profile data for. Це вимагається, якщо ви не знайдете власний профіль URL (/members/andy/…), іншимвикористанням є ID ID, який використовується користувачем.

    • Default value: bp_displayed_user_id()
  • member_type optional

    Лімітні поля можуть бути такими, що відносяться до того, що ведеться member typ, або array of member types. Якщо $user_id є встановленим, значення $member_type буде бути зафіксовано в member types of user. The special value of 'any' will return only those fields that are unrestricted by member type – i.e., those applicable to any type.

    • Default value: false
  • hide_empty_groups optional

    By default empty groups will not be displayed. Якщо ви надаєте 0 значення, то всі групи будуть розповсюджені.

    • Default value: true
  • hide_empty_fields optional

    Будь-який, тільки показує empty fields, якщо ми збираємося на борту, або ми можемо скористатися користувачами на сторінці, або це registration page. Якщо ви налаштовуєте 0 значення, то всі області будуть бути відтворені на вашій сторінці.

    • Default value: !is_network_admin() && !is_admin() && !bp_is_user_profile_edit() && !bp_is_register_page()
  • fetch_fields optional

    Whether to fetch each group’s fields.

    • Default value: false
  • fetch_fields_data optional

    Щодо fetch data для кожного поля. Requires a $user_id .

    • Default value: false
  • exclude_groups optional

    Comma-separated list або array of group IDs до exclude.

    • Default value: array()
  • exclude_fields optional

    Comma-separated list або array of field IDs exclude.

    • Default value: array()
  • update_meta_cache optional

    Щодо попереднього розповсюдження xprofilemeta для всіх відновлених груп, полів, і даних.

    • Default value: true

Advanced Usage

Fetch all the profile data for the user with ID 10 .

Використовувати profile data for fields в profile group ID 2 for user with ID 10 .

Використовуйте профіль даних для повідомлень в межах групи ID 2 .

Використовуйте всі ці дані, навіть empty fieds and groups, для поточного користувача.

Використовуйте всі profile data для користувача з ID 10 , виключені поля з ID 5, 6, 7 .