Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 8042736

Browse files
minor #42855 [DependencyInjection] Optimize PHP preloading (lyrixx)
This PR was merged into the 5.4 branch. Discussion ---------- [DependencyInjection] Optimize PHP preloading | Q | A | ------------- | --- | Branch? | 5.4 | Bug fix? | | New feature? | no | Deprecations? | no | Tickets | | License | MIT | Doc PR | I'm trying to solve a warning when my app is booting: ``` [02-Sep-2021 10:02:59] NOTICE: PHP message: PHP Warning: Can't preload unlinked class Symfony\Component\Security\Core\Authorization\ExpressionLanguageProvider: Unknown interface Symfony\Component\ExpressionLanguage\ExpressionFunctionProviderInterface in /app/vendor/symfony/security-core/Authorization/ExpressionLanguageProvider.php on line 22 ``` It looks like it's not fixable since PHP parse all the file, even if the class declaration is wrapped in an `if (false)` statement. But anyway, I found some optimisations * reuse the `$preloaded` var, to avoid parsing the same list many times (`Preloader::preload()`) is called many times in `var/cache/prod/App_KernelProdContainer.preload.php` * call `class_exist` before using the reflection to avoid a useless throw / catch. Commits ------- 19e4135 [DependencyInjection] Optimize PHP preloading
2 parents 8f081fe + 19e4135 commit 8042736

File tree

7 files changed

+14
-9
lines changed

7 files changed

+14
-9
lines changed

src/Symfony/Component/DependencyInjection/Dumper/PhpDumper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ class %s extends {$options['class']}
342342

343343
$code[$options['class'].'.preload.php'] .= <<<'EOF'
344344
345-
Preloader::preload($classes);
345+
$preloaded = Preloader::preload($classes);
346346

347347
EOF;
348348
}

src/Symfony/Component/DependencyInjection/Dumper/Preloader.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,10 @@ public static function append(string $file, array $list): void
3434
$classes[] = sprintf("\$classes[] = %s;\n", var_export($item, true));
3535
}
3636

37-
file_put_contents($file, sprintf("\n\$classes = [];\n%sPreloader::preload(\$classes);\n", implode('', $classes)), \FILE_APPEND);
37+
file_put_contents($file, sprintf("\n\$classes = [];\n%s\$preloaded = Preloader::preload(\$classes, \$preloaded);\n", implode('', $classes)), \FILE_APPEND);
3838
}
3939

40-
public static function preload(array $classes): void
40+
public static function preload(array $classes, array $preloaded = []): array
4141
{
4242
set_error_handler(function ($t, $m, $f, $l) {
4343
if (error_reporting() & $t) {
@@ -50,7 +50,6 @@ public static function preload(array $classes): void
5050
});
5151

5252
$prev = [];
53-
$preloaded = [];
5453

5554
try {
5655
while ($prev !== $classes) {
@@ -65,6 +64,8 @@ public static function preload(array $classes): void
6564
} finally {
6665
restore_error_handler();
6766
}
67+
68+
return $preloaded;
6869
}
6970

7071
private static function doPreload(string $class, array &$preloaded): void
@@ -76,6 +77,10 @@ private static function doPreload(string $class, array &$preloaded): void
7677
$preloaded[$class] = true;
7778

7879
try {
80+
if (!class_exists($class) && !interface_exists($class, false) && !trait_exists($class, false)) {
81+
return;
82+
}
83+
7984
$r = new \ReflectionClass($class);
8085

8186
if ($r->isInternal()) {

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services10_as_files.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ $classes = [];
140140
$classes[] = 'FooClass';
141141
$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
142142

143-
Preloader::preload($classes);
143+
$preloaded = Preloader::preload($classes);
144144

145145
[ProjectServiceContainer.php] => <?php
146146

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_as_files.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -948,7 +948,7 @@ $classes[] = 'Some\Sidekick2';
948948
$classes[] = 'Request';
949949
$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
950950

951-
Preloader::preload($classes);
951+
$preloaded = Preloader::preload($classes);
952952

953953
[ProjectServiceContainer.php] => <?php
954954

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_inlined_factories.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,7 @@ $classes[] = 'Some\Sidekick2';
579579
$classes[] = 'Request';
580580
$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
581581

582-
Preloader::preload($classes);
582+
$preloaded = Preloader::preload($classes);
583583

584584
[ProjectServiceContainer.php] => <?php
585585

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services9_lazy_inlined_factories.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ $classes[] = 'Bar\FooClass';
186186
$classes[] = 'Bar\FooLazyClass';
187187
$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
188188

189-
Preloader::preload($classes);
189+
$preloaded = Preloader::preload($classes);
190190

191191
[ProjectServiceContainer.php] => <?php
192192

src/Symfony/Component/DependencyInjection/Tests/Fixtures/php/services_non_shared_lazy_as_files.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ $classes = [];
152152
$classes[] = 'Bar\FooLazyClass';
153153
$classes[] = 'Symfony\Component\DependencyInjection\ContainerInterface';
154154

155-
Preloader::preload($classes);
155+
$preloaded = Preloader::preload($classes);
156156

157157
[ProjectServiceContainer.php] => <?php
158158

0 commit comments

Comments
 (0)