Profiling PHP Code in 1C-Bitrix (Xdebug, Blackfire)
We often encounter situations where a Bitrix site loads in 4–6 seconds, even though nginx and MySQL are fine. PHP spends the lion's share of time on unclear operations. Without a profiler, it's guesswork. With a profiler, exact numbers: which function, how many times called, how long it took. Let's break down two working tools—Xdebug and Blackfire—and show how to find and eliminate bottlenecks. Based on our experience (10+ years, 500+ projects), we guarantee transparent results. Budget savings on development after optimization can reach 50,000–200,000 ₽ depending on complexity.
Why Profiling Is Critical for Bitrix
In complex catalogs with thousands of information blocks and components, performance degrades unnoticed. One page might call CIBlockElement::GetList() 40 times without caching. Or an agent recalculates carts every 5 minutes. Without a profiler, such issues take hours to find. With a profiler, 10 minutes for a measurement and you immediately know where to look. Developer time savings up to 70%.
Xdebug: Profiling via cachegrind
Xdebug is a PHP extension that records traces in cachegrind format. The file is opened in KCachegrind or QCacheGrind. Installation and configuration:
pecl install xdebug # or apt-get install php8.2-xdebug # php.ini or 99-xdebug.ini [xdebug] zend_extension=xdebug.so xdebug.mode=profile xdebug.output_dir=/tmp/xdebug xdebug.profiler_output_name=callgrind.out.%p.%r xdebug.start_with_request=trigger start_with_request=trigger enables profiling only via GET parameter ?XDEBUG_PROFILE=1 or cookie. Do not enable always on production—overhead is 10–20x. According to Xdebug documentation, profiling mode is intended for development, not production servers (xdebug.org/docs/profiler).
Profiling a request:
curl "https://site.ru/catalog/product/?XDEBUG_PROFILE=1" -o /dev/null A file callgrind.out.* appears in /tmp/xdebug. Open it in KCachegrind—call tree and percentage time per function.
What to Look for in a Bitrix Profile
Typical bottlenecks visible in cachegrind:
-
CIBlockElement::GetList()—called dozens of times without cache. Total time >30% indicates component caching issues. -
CSQLWhere::GetQuery()—complex filters without indexes. -
CBitrixComponent::includeComponent()—20+ nested components accumulate overhead. -
CUser::IsAuthorized()—not cached between calls. -
\Bitrix\Main\ORM\Query\Query::exec()—fetchAll()on large selections without limit.
Which Tool to Choose: Xdebug or Blackfire?
| Criterion | Xdebug cachegrind | Blackfire |
|---|---|---|
| Overhead | ~10–20x slowdown | ~2x |
| Analysis convenience | KCachegrind (desktop) | Web interface, graph |
| Profile comparison | Manual | Built-in diff |
| CLI scripts | Yes | Yes |
| Production | No | Yes (with caution) |
| Cost | Free | Freemium |
Blackfire runs 5–10x faster than Xdebug on production and is suitable for continuous profiling. Xdebug is better for deep analysis on a dev server.
Blackfire: Profiling with Aggregation
Blackfire is a SaaS solution. Agent on server, PHP extension intercepts execution, data goes to blackfire.io. Installation and configuration:
wget -O - https://packages.blackfire.io/gpg.key | apt-key add - echo "deb http://packages.blackfire.io/debian any main" > /etc/apt/sources.list.d/blackfire.list apt-get update && apt-get install blackfire blackfire-php # php.ini extension=blackfire.so blackfire.agent_socket=tcp://127.0.0.1:8307 # Authorization blackfire agent:config --server-id=XXXX --server-token=YYYY blackfire agent:start Running profiling:
# CLI blackfire run php artisan bitrix:some-command # Via curl blackfire curl https://site.ru/catalog/ # Via Blackfire browser extension—click "Profile" on the page. Practical Optimization Algorithm
Step-by-step plan
1. Baseline measurement. Profile the page, record top 5 functions by time. 2. Root cause analysis. Look at call stack—who calls the expensive function and how many times. For example, `GetList` may be called 40 times due to a loop in a component. 3. Caching. Enable component cache (`CACHE_TYPE=A`, `CACHE_TIME=3600`) or cache the result manually via `\Bitrix\Main\Data\Cache`. 4. Remeasure. Compare with baseline. 5. Query optimization. Remove unnecessary fields in `$select`, add indexes, rewrite from `GetList` to D7 ORM.Why Profiling Should Be Done on a Dev Server?
Xdebug adds significant latency (10–20x), so its use on a production server is unacceptable. Even Blackfire with low overhead can affect real users. A dev server with a copy of the data provides accurate measurements without business risk. If the production server is not available for profiling, we set up staging with data synchronization. Contact us for details on environment setup.
How to Read a cachegrind Profile
KCachegrind shows a call tree where each node is a function with execution time (self vs inclusive). Look for functions where inclusive time exceeds 10% of total time. For Bitrix, these are often CIBlockElement::GetList, CSQLWhere::GetQuery, and CUser::IsAuthorized. Enable filter for the bitrix module—it will cut off all PHP core functions. Order profiling and get a detailed analysis from our engineers.
Profiling Agents and CLI
For background agents and CLI scripts, use XDEBUG_MODE=profile or blackfire run. Example:
XDEBUG_MODE=profile php /path/to/script.php blackfire run php /path/to/script.php This helps identify slow agents that drag down background performance.
What's Included in Our Work
- Setting up Xdebug and/or Blackfire on a dev server or staging environment.
- Profiling 3–5 key pages/scripts.
- Detailed report with call graphs and timings.
- Recommendations for optimization (caching, indexes, refactoring).
- Re-profiling after implementing fixes.
- Final documentation and team consultation.
Timeline
| Task | Duration |
|---|---|
| Profiler setup | 2–6 hours |
| Profiling + report for one page | 2–4 hours |
| Comprehensive audit of 3–5 pages | 2–5 days |
| Bottleneck optimization | from 3 days |
Pricing is individual based on scope. We guarantee transparency—you get not just a report, but fixed bottlenecks and measurable performance improvement. Contact us for a project assessment—we'll define the work scope and propose a profiling plan. Order profiling and see the effectiveness.
Additional resources: Profiling (programming) and Xdebug. According to Xdebug documentation, profiling mode is intended for development.

