bug #12137 [FrameworkBundle] cache:clear command fills *.php.meta files with wrong data (Strate)
This PR was submitted for the 2.5 branch but it was merged into the 2.3 branch instead (closes #12137).
Discussion
----------
[FrameworkBundle] cache:clear command fills *.php.meta files with wrong data
| Q | A
| ------------- | ---
| Bug fix? | yes
| New feature? | no
| BC breaks? | no
| Deprecations? | no
| Tests pass? | yes
| Fixed tickets | #12110
| License | MIT
Test and fix of ticket #12110
Commits
-------
76273bf
[FrameworkBundle] cache:clear command fills *.php.meta files with wrong data
This commit is contained in:
commit
ce3682190c
@ -112,6 +112,9 @@ EOF
|
|||||||
$tempKernel = $this->getTempKernel($realKernel, $namespace, $realKernelClass, $warmupDir);
|
$tempKernel = $this->getTempKernel($realKernel, $namespace, $realKernelClass, $warmupDir);
|
||||||
$tempKernel->boot();
|
$tempKernel->boot();
|
||||||
|
|
||||||
|
$tempKernelReflection = new \ReflectionObject($tempKernel);
|
||||||
|
$tempKernelFile = $tempKernelReflection->getFileName();
|
||||||
|
|
||||||
// warmup temporary dir
|
// warmup temporary dir
|
||||||
$warmer = $tempKernel->getContainer()->get('cache_warmer');
|
$warmer = $tempKernel->getContainer()->get('cache_warmer');
|
||||||
if ($enableOptionalWarmers) {
|
if ($enableOptionalWarmers) {
|
||||||
@ -147,6 +150,9 @@ EOF
|
|||||||
file_put_contents(str_replace($search, $replace, $file), $content);
|
file_put_contents(str_replace($search, $replace, $file), $content);
|
||||||
unlink($file);
|
unlink($file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// remove temp kernel file after cache warmed up
|
||||||
|
@unlink($tempKernelFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -186,13 +192,30 @@ namespace $namespace
|
|||||||
{
|
{
|
||||||
return '$rootDir';
|
return '$rootDir';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function buildContainer()
|
||||||
|
{
|
||||||
|
\$container = parent::buildContainer();
|
||||||
|
|
||||||
|
// filter container's resources, removing reference to temp kernel file
|
||||||
|
\$resources = \$container->getResources();
|
||||||
|
\$filteredResources = array();
|
||||||
|
foreach (\$resources as \$resource) {
|
||||||
|
if ((string) \$resource !== __FILE__) {
|
||||||
|
\$filteredResources[] = \$resource;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
\$container->setResources(\$filteredResources);
|
||||||
|
|
||||||
|
return \$container;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EOF;
|
EOF;
|
||||||
$this->getContainer()->get('filesystem')->mkdir($warmupDir);
|
$this->getContainer()->get('filesystem')->mkdir($warmupDir);
|
||||||
file_put_contents($file = $warmupDir.'/kernel.tmp', $code);
|
file_put_contents($file = $warmupDir.'/kernel.tmp', $code);
|
||||||
require_once $file;
|
require_once $file;
|
||||||
@unlink($file);
|
|
||||||
$class = "$namespace\\$class";
|
$class = "$namespace\\$class";
|
||||||
|
|
||||||
return new $class($parent->getEnvironment(), $parent->isDebug());
|
return new $class($parent->getEnvironment(), $parent->isDebug());
|
||||||
|
@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Bundle\FrameworkBundle\Tests\Command\CacheClearCommand;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Console\Application;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Tests\Command\CacheClearCommand\Fixture\TestAppKernel;
|
||||||
|
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
|
||||||
|
use Symfony\Component\Config\ConfigCache;
|
||||||
|
use Symfony\Component\Config\Resource\ResourceInterface;
|
||||||
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
|
use Symfony\Component\Console\Output\NullOutput;
|
||||||
|
use Symfony\Component\Filesystem\Filesystem;
|
||||||
|
use Symfony\Component\Finder\Finder;
|
||||||
|
|
||||||
|
class CacheClearCommandTest extends TestCase
|
||||||
|
{
|
||||||
|
/** @var TestAppKernel */
|
||||||
|
private $kernel;
|
||||||
|
/** @var Filesystem */
|
||||||
|
private $fs;
|
||||||
|
private $rootDir;
|
||||||
|
|
||||||
|
protected function setUp()
|
||||||
|
{
|
||||||
|
$this->fs = new Filesystem();
|
||||||
|
$this->kernel = new TestAppKernel('test', true);
|
||||||
|
$this->rootDir = sys_get_temp_dir().DIRECTORY_SEPARATOR.uniqid('sf2_cache_');
|
||||||
|
$this->kernel->setRootDir($this->rootDir);
|
||||||
|
$this->fs->mkdir($this->rootDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function tearDown()
|
||||||
|
{
|
||||||
|
$this->fs->remove($this->rootDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testCacheIsFreshAfterCacheClearedWithWarmup()
|
||||||
|
{
|
||||||
|
$input = new ArrayInput(array('cache:clear'));
|
||||||
|
$application = new Application($this->kernel);
|
||||||
|
$application->setCatchExceptions(false);
|
||||||
|
|
||||||
|
$application->doRun($input, new NullOutput());
|
||||||
|
|
||||||
|
// Ensure that all *.meta files are fresh
|
||||||
|
$finder = new Finder();
|
||||||
|
$metaFiles = $finder->files()->in($this->kernel->getCacheDir())->name('*.php.meta');
|
||||||
|
// simply check that cache is warmed up
|
||||||
|
$this->assertGreaterThanOrEqual(1, count($metaFiles));
|
||||||
|
foreach ($metaFiles as $file) {
|
||||||
|
$configCache = new ConfigCache(substr($file, 0, -5), true);
|
||||||
|
$this->assertTrue(
|
||||||
|
$configCache->isFresh(),
|
||||||
|
sprintf(
|
||||||
|
'Meta file "%s" is not fresh',
|
||||||
|
(string) $file
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check that app kernel file present in meta file of container's cache
|
||||||
|
$containerRef = new \ReflectionObject($this->kernel->getContainer());
|
||||||
|
$containerFile = $containerRef->getFileName();
|
||||||
|
$containerMetaFile = $containerFile.'.meta';
|
||||||
|
$kernelRef = new \ReflectionObject($this->kernel);
|
||||||
|
$kernelFile = $kernelRef->getFileName();
|
||||||
|
/** @var ResourceInterface[] $meta */
|
||||||
|
$meta = unserialize(file_get_contents($containerMetaFile));
|
||||||
|
$found = false;
|
||||||
|
foreach ($meta as $resource) {
|
||||||
|
if ((string) $resource === $kernelFile) {
|
||||||
|
$found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$this->assertTrue($found, 'Kernel file should present as resource');
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Symfony\Bundle\FrameworkBundle\Tests\Command\CacheClearCommand\Fixture;
|
||||||
|
|
||||||
|
use Symfony\Bundle\FrameworkBundle\FrameworkBundle;
|
||||||
|
use Symfony\Component\Config\Loader\LoaderInterface;
|
||||||
|
use Symfony\Component\HttpKernel\Kernel;
|
||||||
|
|
||||||
|
class TestAppKernel extends Kernel
|
||||||
|
{
|
||||||
|
public function registerBundles()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
new FrameworkBundle(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setRootDir($rootDir)
|
||||||
|
{
|
||||||
|
$this->rootDir = $rootDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function registerContainerConfiguration(LoaderInterface $loader)
|
||||||
|
{
|
||||||
|
$loader->load(__DIR__.DIRECTORY_SEPARATOR.'config.yml');
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,2 @@
|
|||||||
|
framework:
|
||||||
|
secret: test
|
Reference in New Issue
Block a user