All Projects → fabfuel → Prophiler

fabfuel / Prophiler

Licence: other
PHP Profiler & Developer Toolbar (built for Phalcon)

Projects that are alternatives of or similar to Prophiler

Sympact
🔥 Stupid Simple CPU/MEM "Profiler" for your JS code.
Stars: ✭ 439 (-1.35%)
Mutual labels:  profile, benchmark
php-orm-benchmark
The benchmark to compare performance of PHP ORM solutions.
Stars: ✭ 82 (-81.57%)
Mutual labels:  benchmark, phalcon
Github Profile Readme Generator
GitHub profile readme generator allows you to create nice and simple GitHub profile readme files that will be included in your profile previews.
Stars: ✭ 374 (-15.96%)
Mutual labels:  profile
Smac
SMAC: The StarCraft Multi-Agent Challenge
Stars: ✭ 435 (-2.25%)
Mutual labels:  benchmark
Tuna
Python profile viewer
Stars: ✭ 399 (-10.34%)
Mutual labels:  profile
Benchmarks Of Javascript Package Managers
Benchmarks of JavaScript Package Managers
Stars: ✭ 388 (-12.81%)
Mutual labels:  benchmark
Pyperformance
Python Performance Benchmark Suite
Stars: ✭ 406 (-8.76%)
Mutual labels:  benchmark
Yet Another Bench Script
YABS - a simple bash script to estimate Linux server performance using fio, iperf3, & Geekbench
Stars: ✭ 348 (-21.8%)
Mutual labels:  benchmark
Moses
Molecular Sets (MOSES): A Benchmarking Platform for Molecular Generation Models
Stars: ✭ 440 (-1.12%)
Mutual labels:  benchmark
Toolbarpanel
Toolbar that can be slided down to show a panel
Stars: ✭ 397 (-10.79%)
Mutual labels:  toolbar
Bubblepictures
Bubble Pictures for iOS done in Swift
Stars: ✭ 434 (-2.47%)
Mutual labels:  profile
Blurtestandroid
This is a simple App to test some blur algorithms on their visual quality and performance.
Stars: ✭ 396 (-11.01%)
Mutual labels:  benchmark
Sysbench
Scriptable database and system performance benchmark
Stars: ✭ 4,268 (+859.1%)
Mutual labels:  benchmark
Linkedin scraper
A library that scrapes Linkedin for user data
Stars: ✭ 413 (-7.19%)
Mutual labels:  profile
Ffi Overhead
comparing the c ffi (foreign function interface) overhead on various programming languages
Stars: ✭ 387 (-13.03%)
Mutual labels:  benchmark
Nanobench
Simple, fast, accurate single-header microbenchmarking functionality for C++11/14/17/20
Stars: ✭ 436 (-2.02%)
Mutual labels:  benchmark
Yona Cms
CMS based on Phalcon PHP Framework with modular structure
Stars: ✭ 374 (-15.96%)
Mutual labels:  phalcon
Uiwidget
一个集成TabLayout、UIAlertDialog、UIActionSheetDialog、UIProgressDialog、TitleBarView(自带沉浸式标题栏)、CollapsingTitleBarLayout、RadiusView(圆角及状态背景设置View解放shape文件)、KeyboardHelper(软键盘控制及遮挡控制类)、StatusViewHelper(状态栏沉浸帮助类)、NavigationViewHelper(导航栏沉浸式帮助类)、AlphaViewHelper(View透明度控制帮助类) 等项目常用UI库
Stars: ✭ 400 (-10.11%)
Mutual labels:  toolbar
Completely Unscientific Benchmarks
Naive performance comparison of a few programming languages (JavaScript, Kotlin, Rust, Swift, Nim, Python, Go, Haskell, D, C++, Java, C#, Object Pascal, Ada, Lua, Ruby)
Stars: ✭ 440 (-1.12%)
Mutual labels:  benchmark
Vmprof Python
vmprof - a statistical program profiler
Stars: ✭ 395 (-11.24%)
Mutual labels:  profile

Prophiler - A PHP Profiler & Developer Toolbar built for Phalcon

Scrutinizer Code Quality Code Coverage Build Status License Latest Stable Version

Demo

The demo website has been moved to a separate repository: https://github.com/fabfuel/prophiler-demo

Here you can see the toolbar in action: http://prophiler.fabfuel.de/demo.php

Timeline Preview

Installation

You can use composer to install the Prophiler. Just add it as dependency:

"require": {
   	"fabfuel/prophiler": "~1.0",
}

Setup (general)

Setting up the Prophiler and the developer toolbar can be done via the following simple steps. It could all be done in your front-controller (e.g. public/index.php in Phalcon)

1. Initialize the Profiler (as soon as possible)

Generally it makes sense to initialize the profiler as soon as possible, to measure as much execution time as you can. You should initialize the profiler in your front-controller or the bootstrap file right after requiring the Composer autoloader.

$profiler = new \Fabfuel\Prophiler\Profiler();

2. Initialize and register the Toolbar

To visualize the profiling results, you have to initialize and render the Prophiler Toolbar. This component takes care for rendering all results of the profiler benchmarks and other data collectors. Put that at the end of the front-controller.

You can also add other data collectors to the Toolbar, to show e.g. request data like in this example.

$toolbar = new \Fabfuel\Prophiler\Toolbar($profiler);
$toolbar->addDataCollector(new \Fabfuel\Prophiler\DataCollector\Request());
echo $toolbar->render();

You can also easily create you own data collectors, by implementing the DataCollectorInterface and adding an instance to the Toolbar.

...
$toolbar->addDataCollector(new \My\Custom\DataCollector());
...

Additional setup for Phalcon applications

1. Add the profiler to the dependency injection container

Add the profiler instance to the DI container, that other plugins and adapters can use it across the application. This should be done in or after your general DI setup.

$di->setShared('profiler', $profiler);

2. Initialize the plugin manager

The plugin manager registers all included Phalcon plugins automatically and attaches them to the events manager. To make the plugins work properly, make sure that the default events manager is attached to your Dispatcher, View and Connection services.

$pluginManager = new \Fabfuel\Prophiler\Plugin\Manager\Phalcon($profiler);
$pluginManager->register();

Custom Benchmarks

You can easily add custom benchmarks to your code:

$benchmark = $profiler->start('\My\Class::doSomething', ['additional' => 'information'], 'My Component');
...
$profiler->stop($benchmark);

Or stop without passing the benchmark

In some scenarios (e.g. custom adapters) it might be hard to pass the received benchmark to the stop() method. Alternatively you can simply omit the $benchmark parameter. If that is the case, the profiler simply stops the last started benchmark, but it is not possible to run overlapping benchmarks.

$profiler->start('\My\Class::doSomeOtherThing', ['additional' => 'information'], 'My Component');
...
$profiler->stop();

Aggregations

Prophiler now features benchmark aggregations. These give you a lot more insights and are extremely useful to:

  • quickly see the total number of recurring executions (e.g. database or cache queries)
  • analyze minimum, maximum and average execution times of recurring executions
  • easily see (e.g. accidentally) recurring executions of the same database query
  • get a warning, if the total number of executions exceeds a custom threshold
  • get a warning, if the maximum execution time exceeds a custom threshold

Setup

Prophiler comes with some aggregators, but you can easily create your own. To Set up an aggregator, all you need to do is to register the aggregator at the profiler instance:

$profiler->addAggregator(new \Fabfuel\Prophiler\Aggregator\Database\QueryAggregator());
$profiler->addAggregator(new \Fabfuel\Prophiler\Aggregator\Cache\CacheAggregator());

That's it. You immediately see all database and cache queries, grouped by command/query, including the total number of executions, the total duration of all executions as well as the minimum, maximum and average execution time.

Logging

You can use Prophiler to log events and other data and view it in the timeline and in the separate "Logs" tab. If you already have a logging infrastructure, you can add the PSR-3 compliant Logger adapter to it. Otherwise you can also just instantiate and use it directly:

$logger = new \Fabfuel\Prophiler\Adapter\Psr\Log\Logger($profiler);
$logger->warning('This is a warning!', ['some' => 'context']);
$logger->debug('Some debugging information', ['query' => ['user' => 12345], 'foo' => 'bar']);

Adapters and Decorators

Doctrine

To profile all SQL queries made by Doctrine, you just have to register the SQLLogger adapter in your Doctrine configuration, for example in your bootstrap.php like that:

$sqlLogger = new Fabfuel\Prophiler\Adapter\Doctrine\SQLLogger($profiler);
$entityManager->getConnection()->getConfiguration()->setSQLLogger($sqlLogger);

PDO

To profile your PDO database actions, you can use the Prophiler PDO decorator. It will record all query() & exec() calls and prepared statements as well. Just decorate your PDO instance with the Prophiler decorator and use that instead:

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$db = new \Fabfuel\Prophiler\Decorator\PDO\PDO($pdo, $profiler);

$db->query('SELECT * from users');
$db->exec('DELETE FROM users WHERE active = 0');
$db->prepare('SELECT * from users WHERE userId = ?');

Cache

To profile Phalcon cache backend requests, you only need to decorate the cache backend with the BackendDecorator. It will benchmark all cache operations automatically. Here is an example with the APC backend:

$cacheFrontend = new \Phalcon\Cache\Frontend\Data(['lifetime' => 172800]);
$cacheBackend = new \Phalcon\Cache\Backend\Apc($cacheFrontend, ['prefix' => 'app-data']);

$cache = \Fabfuel\Prophiler\Decorator\Phalcon\Cache\BackendDecorator($cacheBackend, $profiler);

Elasticsearch

To profile Elasticsearch requests, you only need to decorate the Elasticsearch client with the ClientDecorator:

$elasticsearch = new Elasticsearch\Client(['your' => 'config']);
$client = new \Fabfuel\Prophiler\Decorator\Elasticsearch\ClientDecorator($client, $profiler);

Tips

Record session writing

To record session writing, you can commit (this is also known as session_write_close()) the session before rendering the toolbar

session_commit();
Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].