Download the PHP package magepsycho/magento2-profiler-ui without Composer

On this page you can find all versions of the php package magepsycho/magento2-profiler-ui. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.

FAQ

After the download, you have to make one include require_once('vendor/autoload.php');. After that you have to import the classes with use statements.

Example:
If you use only one package a project is not needed. But if you use more then one package, without a project it is not possible to import the classes with use statements.

In general, it is recommended to use always a project to download your libraries. In an application normally there is more than one library needed.
Some PHP packages are not free to download and because of that hosted in private repositories. In this case some credentials are needed to access such packages. Please use the auth.json textarea to insert credentials, if a package is coming from a private repository. You can look here for more information.

  • Some hosting areas are not accessible by a terminal or SSH. Then it is not possible to use Composer.
  • To use Composer is sometimes complicated. Especially for beginners.
  • Composer needs much resources. Sometimes they are not available on a simple webspace.
  • If you are using private repositories you don't need to share your credentials. You can set up everything on our site and then you provide a simple download link to your team member.
  • Simplify your Composer build process. Use our own command line tool to download the vendor folder as binary. This makes your build process faster and you don't need to expose your credentials for private repositories.
Please rate this library. Is it a good library?

Informations about the package magento2-profiler-ui

# Magento 2 Enhanced Profiler UI ![Magento 2 Enhanced Profiler UI](https://i.imgur.com/d8QEHRb.png)
[![Packagist Version](https://img.shields.io/github/v/tag/MagePsycho/magento2-profiler-ui?logo=packagist&sort=semver&label=packagist&style=for-the-badge)](https://packagist.org/packages/magepsycho/magento2-profiler-ui) [![Packagist Downloads](https://img.shields.io/packagist/dt/magepsycho/magento2-profiler-ui.svg?logo=packagist&style=for-the-badge)](https://packagist.org/packages/magepsycho/magento2-profiler-ui/stats) ![Supported Magento Versions](https://img.shields.io/badge/magento-%202.4-brightgreen.svg?logo=magento&longCache=true&style=for-the-badge) ![License](https://img.shields.io/badge/license-OSL--3.0-green?color=%23234&style=for-the-badge)

[!IMPORTANT] This extension has moved to Mage-OS: mage-os-lab/module-profiler-admin-ui.

It was ported there for wider community adoption, and all further development happens in that repository. Please use the Mage-OS package — this repository is kept for reference only.

The module name changes from MagePsycho_ProfilerUi to MageOS_ProfilerAdminUi; the recorder module is now mage-os-lab/module-profiler (mage-os/module-profiler).

Overview

Magento 2 Enhanced Profiler UI is the admin viewer for the json reports written by MagePsycho_Profiler.

System → Tools → Enhanced Profiler Reports

Pick a recorded run from the dropdown and get an interactive view of it: a collapsible tree you can sort and filter without leaving, or a timeline of every individual call — with the SQL behind any query timer one click away. Admin-side on purpose — the storefront may be headless, and profiler output is not something to expose there in any case.

It only reads what MagePsycho_Profiler writes. It adds nothing to the recording side, registers no plugins and touches no request path other than its own, so it can be left uninstalled in production without changing what gets profiled.

Why a separate module

MagePsycho_Profiler is meant to be safe to enable anywhere; it is an output type plus instrumentation and has no HTTP surface of its own. An admin UI is a different proposition — controllers, ACL, an attack surface — so it installs separately and can be left off in production.

Demo

Tree and Timeline views of a recorded run:

![Enhanced Profiler UI — tree and timeline views](./docs/enhanced-profiler-ui-demo.gif)

Key Features

Feature Highlights

The Report Table

Column Meaning
Timer Id Leaf name, indented by depth; the full a->b->c path is the row tooltip
Cnt Times the timer was started
Time Total wall time, inclusive of children
Self Time minus the sum of direct children — where work with no timer of its own shows up
Avg Time / Cnt
Emalloc / RealMem Memory deltas
% Share of the root timer

Self is the column worth learning. On a real POST /V1/integration/customer/token, magento measured 96.2ms while its children summed to 45.6ms — 53% of the request had no timer on it at all. That gap is invisible in the Time column and obvious in Self.

Tree And Timeline

Two modes, picked from the View switch. Both are filterable, and the tree is sortable — there is no flat fallback to fall out of.

Tree (the default) is structural browsing. Real HTML indentation with an expand/collapse control on every row that has children — no ├─ box-drawing, which is a terminal constraint the ASCII log has to live with and a web page does not. Expand all / Collapse all are in the toolbar; Collapse all keeps the roots open so the top level stays readable. Parent rows are bold, and hovering a row shows its full a->b->c path as a tooltip.

![Tree view — collapsible hierarchy with the Self column heat-shaded](./docs/enhanced-profiler-tree-view.png)

Show all rows (ticked by default) decides what a filter does. Ticked, nothing is removed: matching rows are tinted and flagged in the margin, everything else stays exactly where it was, and the count line reads 34 matches highlighted of 273 timers. The Self column keeps its heat colour inside a highlighted row; you never trade the "where did the time go" signal for the "what did I search for" one.

Untick it and non-matching rows go away — but a match's parents stay, dimmed, so the hierarchy above every hit is still there. That is what makes hiding safe in a tree: prune the ancestors too and a surviving child appears to hang off nothing. Paths to a match open automatically; the collapse state you had comes back when you clear the filter. The same rule applies to the timeline, whose bars are indented by depth for the same reason.

![Tree view filtered to SQL — matches highlighted, their parent chain kept as dimmed context](./docs/enhanced-profiler-tree-filtered-view.png)

Sorting stays in the tree as well. A column sorts siblings under their own parent, then the tree is re-flattened, so indentation still means what it says and the answer to "what is the slowest child of this timer" survives. Sorting by Time from the root down is the fastest way to walk the hot path of a request.

Reset — next to Expand all / Collapse all — puts the filter, both sliders, the sort, the match toggle, the collapse state and the view back to how the run first loaded. It leaves the Run selector alone: resetting the view you are looking at should not throw away which run you chose to look at.

The sliders are seeded from the loaded report, so their range always matches the data in front of you.

Seeing The Statement

A report recorded with MAGE_PROFILER_SQL=query carries the statement behind every SQL: timer. Those rows pick up a dotted underline; clicking one opens the query, syntax-highlighted, with its bind params. A tree row is an aggregate, so its popup groups identical statements - ×18 with the summed and slowest duration - while a timeline bar is a single call and shows just that one. Copy puts the raw statement on the clipboard, and Esc, the backdrop or × closes the panel.

![SQL statement popup — the query behind a timer, syntax-highlighted with its bind params](./docs/enhanced-profiler-sql-query-detail.jpg)

Above: 1 filters to SQL:, 2 unticks Show all rows so only matches and their dimmed parents survive, 3 is the clicked timer — SQL:SELECT (catalog_product_entity +3), 1.916 ms — and 4 is the statement it stood for, joins, IN (…) list and all.

Nothing appears for a report recorded without capture, which is every report by default. Highlighting is a small built-in tokenizer rather than a bundled library, so the viewer still ships no JavaScript dependencies.

Timeline is one bar per recorded call, ordered by start, indented by depth, coloured by subsystem (SQL:, CACHE:, EVENT:, …) with a legend built from whatever the run actually contains. This is where you see when something happened rather than just how long it took in total — a burst of queries mid-request, a cache stampede, one slow call versus four hundred fast ones.

![Timeline view — one bar per call, coloured by subsystem](./docs/enhanced-profiler-timeline-view.png)

Every capture records spans, so Timeline works on any recent report — MAGE_PROFILER=json and MAGE_PROFILER=timeline are the same thing. The radio only disables for reports recorded with MAGE_PROFILER_MAX_SPANS=0, or from before spans were always captured. The Timer Id filter and the min-time slider both narrow the chart.

The x-axis uses wall_ms (first start to last end), not total_ms (the sum of root timers that the % column is a share of). On a CLI run those differ by ~40% because the roots are sequential.

Each row ends with its own duration, right-aligned into one column and thousands-separated, so a bar too small to see still tells you what it cost. The number is heat-shaded on the same pale-amber-to-deep-red ramp as the Self column, with one difference in how it is scaled: a span's duration is inclusive, so scaling against the largest would paint the root red and leave everything below it uniformly pale — colour encoding depth rather than cost. The ceiling is the 95th percentile instead, and never below a tenth of the wall clock, so a 2ms cache read on a quiet run does not come out as red as a 700ms request.

Recording Something To Look At

The viewer reads the json output, so a run has to exist before there is anything in the dropdown:

The cookie accepts the same values as the environment variable — tabular,json and timeline both work there too. json is what this viewer reads; tabular writes a plain-text log instead, which is worth adding on CLI (it prints to STDERR as the command finishes) and rarely worth it on a web request, where there is no terminal to print to.

Cookie activation is gated — developer mode, or a :<secret> suffix matching MAGE_PROFILER_SECRET. See MagePsycho_Profiler for the full activation and security rules.

Retention

MagePsycho_Profiler prunes as it writes: newest MAGE_PROFILER_KEEP runs (default 100), nothing older than MAGE_PROFILER_KEEP_DAYS (default 7). A browsing session with the cookie set writes one report per request, AJAX included, so this matters. Clear all reports empties the directory and the index.

🛠️ Installation

This module requires MagePsycho_Profiler; Composer pulls it in automatically.

1 Using Composer (Preferred)

2 Using Modman

3 Using Zip File

After installation by either means, activate the extension with following steps

  1. Enable the module

  2. Flush the store cache

  3. Deploy static content - in Production mode only

  4. Record a run, then open the viewer

System → Tools → Enhanced Profiler Reports

The extension creates no tables of its own.

Configuration

There is no store configuration. The viewer has nothing to configure — what it shows is decided by what MagePsycho_Profiler recorded, and that module's own settings live at Stores > Configuration > MagePsycho > Enhanced Profiler.

Access is controlled by role, not config: System > Permissions > User Roles > Role Resources → Enhanced Profiler Reports (MagePsycho_ProfilerUi::viewer).

The MagePsycho_Profiler environment variables that change what the viewer sees:

Variable Effect here Default
MAGE_PROFILER_REPORT_DIR Directory the run picker lists var/log/profiler
MAGE_PROFILER_MAX_SPANS 0 records no spans, which disables the Timeline radio 5000
MAGE_PROFILER_KEEP Newest N runs retained 100
MAGE_PROFILER_KEEP_DAYS Maximum age retained 7

Security

The viewer renders data derived from untrusted input, so a few things are deliberate rather than incidental:

Developer Notes

Files

Path Role
Model/ReportRepository.php Lists, reads and clears reports; owns the path guards
Controller/Adminhtml/Report/{Index,Data,Clear}.php Page, JSON endpoint, clear action
Block/Adminhtml/Report.php Run list + endpoints for x-magento-init
view/adminhtml/templates/report.phtml Markup; all output escaped
view/adminhtml/web/js/report.js Tree/timeline rendering, sibling sort, filter closure, sliders

Admin route and ACL

Piece Value
Route magepsycho_profiler/report/index
ACL resource MagePsycho_ProfilerUi::viewer (under Magento_Backend::system)
Menu Magento_Backend::system_tools → Enhanced Profiler Reports

etc/module.xml sequences after Magento_Backend and MagePsycho_Profiler.

Static analysis

Changelog

Version 1.0.5 (2026-08-29)

Version 1.0.4 (2026-08-18)

Version 1.0.3 (2026-08-18)

Version 1.0.2 (2026-08-12)

Version 1.0.1 (2026-08-11)

Version 1.0.0 (2026-08-08)

Authors

Contributors

Contributors

To Contribute

Any contribution to the development of Magento 2 Enhanced Profiler UI is highly welcome.
The best possibility to provide any code is to open a pull request on GitHub.

Need Support?

If you encounter any problems or bugs, please create an issue on GitHub.

Please visit our store for more FREE / paid extensions OR contact us for customization / development services.


All versions of magento2-profiler-ui with dependencies

PHP Build Version
Package Version
Requires magepsycho/magento2-profiler Version *
Composer command for our command line client (download client) This client runs in each environment. You don't need a specific PHP version etc. The first 20 API calls are free. Standard composer command

The package magepsycho/magento2-profiler-ui contains the following files

Loading the files please wait ...