Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
BAP-14658: LoggerDataCollector called over 500k times in dev mode (#1…
…1598) - added local cache for a logger collector - overwrite symfony`s data_collector.logger class - added tests
- Loading branch information
Showing
5 changed files
with
123 additions
and
0 deletions.
There are no files selected for viewing
26 changes: 26 additions & 0 deletions
26
src/Oro/Bundle/LoggerBundle/DataCollector/LoggerDataCollector.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
<?php | ||
|
||
namespace Oro\Bundle\LoggerBundle\DataCollector; | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong. |
||
|
||
use Symfony\Component\HttpKernel\DataCollector\LoggerDataCollector as BaseDataCollector; | ||
|
||
class LoggerDataCollector extends BaseDataCollector | ||
{ | ||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function lateCollect() | ||
{ | ||
// On event kernel.terminate ProfilerListener save profile for each sub-request and calls method lateCollect, | ||
// but sets of logs for each sub-request and master-requests are same, | ||
// so here added local caching to prevent work on the same data and fix performance in dev mode | ||
static $localCache; | ||
|
||
if ($localCache === null) { | ||
parent::lateCollect(); | ||
$localCache = $this->data; | ||
} else { | ||
$this->data = $localCache; | ||
} | ||
} | ||
} |
21 changes: 21 additions & 0 deletions
21
src/Oro/Bundle/LoggerBundle/DependencyInjection/Compiler/LoggerCollectorPass.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
<?php | ||
|
||
namespace Oro\Bundle\LoggerBundle\DependencyInjection\Compiler; | ||
|
||
use Oro\Bundle\LoggerBundle\DataCollector\LoggerDataCollector; | ||
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; | ||
use Symfony\Component\DependencyInjection\ContainerBuilder; | ||
|
||
class LoggerCollectorPass implements CompilerPassInterface | ||
{ | ||
/** | ||
* {@inheritdoc} | ||
*/ | ||
public function process(ContainerBuilder $container) | ||
{ | ||
if ($container->hasDefinition('data_collector.logger')) { | ||
$definition = $container->getDefinition('data_collector.logger'); | ||
$definition->setClass(LoggerDataCollector::class); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
23 changes: 23 additions & 0 deletions
23
src/Oro/Bundle/LoggerBundle/Tests/Unit/DataCollector/LoggerDataCollectorTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
<?php | ||
|
||
namespace Oro\Bundle\LoggerBundle\Tests\Unit\DataCollector; | ||
|
||
use Oro\Bundle\LoggerBundle\DataCollector\LoggerDataCollector; | ||
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface; | ||
|
||
class LoggerDataCollectorTest extends \PHPUnit_Framework_TestCase | ||
{ | ||
public function testLateCollect() | ||
{ | ||
$logger = $this->createMock(DebugLoggerInterface::class); | ||
$logger->expects($this->once()) | ||
->method('countErrors'); | ||
$logger->expects($this->any()) | ||
->method('getLogs') | ||
->willReturn([]); | ||
|
||
$collector = new LoggerDataCollector($logger); | ||
$collector->lateCollect(); | ||
$collector->lateCollect(); | ||
} | ||
} |
51 changes: 51 additions & 0 deletions
51
...o/Bundle/LoggerBundle/Tests/Unit/DependencyInjection/Compiler/LoggerCollectorPassTest.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,51 @@ | ||
<?php | ||
|
||
namespace Oro\Bundle\LoggerBundle\Tests\Unit\DependencyInjection\Compiler; | ||
|
||
use Oro\Bundle\LoggerBundle\DependencyInjection\Compiler\LoggerCollectorPass; | ||
use Symfony\Component\DependencyInjection\ContainerBuilder; | ||
use Symfony\Component\DependencyInjection\Definition; | ||
|
||
class LoggerCollectorPassTest extends \PHPUnit_Framework_TestCase | ||
{ | ||
/** | ||
* @var LoggerCollectorPass | ||
*/ | ||
protected $compilerPass; | ||
|
||
/** | ||
* {@inheritdoc} | ||
*/ | ||
protected function setUp() | ||
{ | ||
$this->compilerPass = new LoggerCollectorPass(); | ||
} | ||
|
||
public function testProcessWhenServiceNotExist() | ||
{ | ||
/** @var \PHPUnit_Framework_MockObject_MockObject|ContainerBuilder $containerBuilder */ | ||
$containerBuilder = $this->createMock(ContainerBuilder::class); | ||
$containerBuilder->expects($this->any()) | ||
->method('hasDefinition') | ||
->with('data_collector.logger') | ||
->willReturn(false); | ||
$containerBuilder->expects($this->never())->method('getDefinition'); | ||
|
||
$this->compilerPass->process($containerBuilder); | ||
} | ||
|
||
public function testProcessWhenServiceExist() | ||
{ | ||
/** @var \PHPUnit_Framework_MockObject_MockObject|ContainerBuilder $containerBuilder */ | ||
$containerBuilder = $this->createMock(ContainerBuilder::class); | ||
$containerBuilder->expects($this->any()) | ||
->method('hasDefinition') | ||
->with('data_collector.logger') | ||
->willReturn(true); | ||
$containerBuilder->expects($this->once()) | ||
->method('getDefinition') | ||
->willReturn(new Definition()); | ||
|
||
$this->compilerPass->process($containerBuilder); | ||
} | ||
} |
Should be remove after update symfony version 3.3+ and merge PR
symfony/symfony#23683
symfony/symfony#23659
\cc @manowark