bug #38063 [FrameworkBundle] generate preload.php in src/ to make opcache.preload predictable (nicolas-grekas)

This PR was merged into the 4.4 branch.

Discussion
----------

[FrameworkBundle] generate preload.php in src/ to make opcache.preload predictable

| Q             | A
| ------------- | ---
| Branch?       | 4.4
| Bug fix?      | yes
| New feature?  | no
| Deprecations? | no
| Tickets       | -
| License       | MIT
| Doc PR        | -

As seen in https://github.com/symfonycorp/cloud-templates/pull/15, having the path of the preload file vary by env+debug makes configuring PHP.ini settings impossible.

This PR dump a new `preload.php` file in `src/` when `cache:clear` is called.
This makes the path predictable.

This is submitted as a bugfix because the current behavior is barely usable without this change.

Commits
-------

54c965c7d0 [FrameworkBundle] generate preload.php in src/ to make opcache.preload predictable
This commit is contained in:
Fabien Potencier 2020-09-07 09:18:11 +02:00
commit d441d867cd
3 changed files with 22 additions and 0 deletions

View File

@ -170,6 +170,20 @@ EOF
}
}
$kernelDir = \dirname((new \ReflectionObject($kernel))->getFileName());
$preloadFile = $fs->makePathRelative(\dirname($containerFile, 2), $kernelDir);
$preloadFile .= substr_replace(basename($containerFile), '.preload', -4, 0);
$preloadFile = var_export('/'.$preloadFile, true);
@file_put_contents($kernelDir.'/preload.php', <<<EOPHP
<?php
if (file_exists(__DIR__.$preloadFile)) {
require __DIR__.$preloadFile;
}
EOPHP
);
if ($output->isVerbose()) {
$io->comment('Finished');
}

View File

@ -38,6 +38,7 @@ class CacheClearCommandTest extends TestCase
protected function tearDown(): void
{
$this->fs->remove($this->kernel->getProjectDir());
$this->fs->remove(__DIR__.'/Fixture/preload.php');
}
public function testCacheIsFreshAfterCacheClearedWithWarmup()
@ -82,5 +83,7 @@ class CacheClearCommandTest extends TestCase
$containerRef = new \ReflectionClass(require $containerFile);
$containerFile = str_replace('tes_'.\DIRECTORY_SEPARATOR, 'test'.\DIRECTORY_SEPARATOR, $containerRef->getFileName());
$this->assertMatchesRegularExpression(sprintf('/\'kernel.container_class\'\s*=>\s*\'%s\'/', $containerClass), file_get_contents($containerFile), 'kernel.container_class is properly set on the dumped container');
$this->assertFileEquals(__DIR__.'/Fixture/preload.php.expected', __DIR__.'/Fixture/preload.php');
}
}

View File

@ -0,0 +1,5 @@
<?php
if (file_exists(__DIR__.'/test/var/cache/test/FixtureSymfony_Bundle_FrameworkBundle_Tests_Command_CacheClearCommand_Fixture_TestAppKernelTestDebugContainer.preload.php')) {
require __DIR__.'/test/var/cache/test/FixtureSymfony_Bundle_FrameworkBundle_Tests_Command_CacheClearCommand_Fixture_TestAppKernelTestDebugContainer.preload.php';
}