performance
Symfony est extrêmement rapide. Bien sûr, si vous avez vraiment besoin de vitesse, il existe de nombreuses façons de rendre Symfony plus rapide. Dans ce chapitre, vous explorerez quelques façons d'accélérer vos programmes Symfony.
Utilisez le cache de code d'octet (tel que OPcache) ¶
La première chose à faire pour améliorer les performances est d'utiliser un "cache de code d'octet". Ces caches stockent les fichiers PHP compilés pour éviter de les recompiler à chaque requête.
Il existe de nombreux caches de code d'octets disponibles, dont certains sont open source. Depuis PHP 5.5, PHP intègre OPcache. Le cache de code d'octet le plus largement utilisé dans les anciennes versions est APC.
L'utilisation du cache de byte code présente tous les avantages et aucun inconvénient, Symfony est conçu pour "fonctionner extrêmement bien dans ce type d'environnement".
Surveiller les modifications du fichier source ¶
La plupart des caches de code d'octet surveillent les modifications du fichier source. Cela garantit que si le code source du fichier change, le code d'octet sera automatiquement compilé. C'est très pratique, mais un peu surchargé.
Par conséquent, certains caches de byte code offrent une option pour désactiver ces vérifications. Par exemple, pour désactiver la vérification dans APC, ajoutez apc.stat=0
directement à votre fichier de configuration php.ini
. apc.stat=0
到你的 php.ini
配置文件中。
当关闭这些检查时,将由服务器管理员来负责“确保缓存在任何源文件发生改变时被清除”。否则,你的更新将不会在程序中被看到。
同理,byte code缓存必须在部署程序时被清除 (例如,使用APC时通过调用 apc_clear_cache()
PHP函数,以及,使用Opcache时通过 opcache_reset()
)。
在PHP中,命令行以及web进程并不共享相同的OPcache。这意味着你不能通过执行终端中的某些命令来清除web服务器上的OPcache。你可以重启服务器或者通过web服务器调用 apc_clear_cache()
或 opcache_reset()
apc_clear_cache()
lors de l'utilisation d'APC, et en appelant la classe opcache_reset()
). 🎜En PHP, la ligne de commande et les processus Web ne partagent pas le même OPcache. Cela signifie que vous ne pouvez pas effacer l'OPcache sur le serveur Web en exécutant certaines commandes dans le terminal. Vous pouvez redémarrer le serveur ou appeler la fonction apc_clear_cache()
ou opcache_reset()
via le serveur Web (par exemple, lors de l'exécution de un script web) ils). 🎜🎜🎜
Optimisez tous les fichiers utilisés par Symfony ¶
Par défaut, l'OPcache de PHP stocke 2000 fichiers dans le cache de byte code. Ce nombre est encore trop petit pour les applications Symfony normales, vous devez donc définir l'option de configuration opcache.max_accelerated_files sur une valeur plus élevée :
; php.iniopcache.max_accelerated_files = 20000
Configurer le cache PHP realpath ¶
PHP utilise un cache interne Stocke le résultat de mappage du « chemin du fichier de classe » au « chemin réel du système de fichiers ». Cela améliore les performances des programmes comme Symfony qui ouvrent de nombreux fichiers PHP, notamment sur les plateformes Windows.
Par défaut, PHP définit un realpath_cache_size
de 16K
, ce qui est trop petit pour Symfony. Mettez à jour cette valeur à au moins 4 096 K
. De plus, les chemins de cache ne sont enregistrés que pendant 120
secondes par défaut. Pensez également à mettre à jour cette valeur via l'option realpath_cache_ttl
: 16K
的 realpath_cache_size
,这对Symfony来说实在太小。将这个值更新到至少 4096K
。此外,缓存路径默认时只保存 120
秒,同样考虑通过 realpath_cache_ttl
选项来更新此值:
; php.ini realpath_cache_size=4096K realpath_cache_ttl=600
使用Composer的类映射功能 ¶
默认时,Symfony标准版使用的是 autoload.php 文件中的Composer自动加载器(autoloader)。这个加载器很容易使用,因为它自动寻找任何“你在已注册目录中放置了”的新类。
不幸的是,这有使用成本,因为类加载器要遍历全部已配置的命名空间,以便找到一个特定文件,发起 file_exists()
的调用直到最终找到它想要的文件为止。
最简单的方案是告诉Composer构建一个优化过的"class map"(类映射),这是一个所有类所在位置的大数组,并且存放在 vendor/composer/autoload_classmap.php
1<. h2> Utiliser la fonction de mappage de classes de Composer ¶
Par défaut, la version standard de Symfony utilise autoload.php
Chargeur automatique du compositeur (chargeur automatique) dans le fichier. Ce chargeur est facile à utiliser car il recherche automatiquement toutes les nouvelles classes que vous placez dans le répertoire enregistré.file_exists()
jusqu'à ce que finalement il trouve le fichier qu'il veut. Cette carte de classes peut être générée à partir de la ligne de commande et peut faire partie de votre processus de déploiement. |
// app.php// ...
use Symfony\Component\ClassLoader\ApcClassLoader;
$loader = require __DIR__.'/../app/autoload.php';include_once __DIR__.'/../app/bootstrap.php.cache';
// Use APC for autoloading to improve performance
// Change 'sf2' by the prefix you want in order
// to prevent key conflict with another application
// 使用APC自动加载以提升性能,改变'sf2'为你希望的前缀,
// 以防止同其他程序发生key冲突$loader = new ApcClassLoader('sf2', $loader);$loader->register(true);
// ...
🎜🎜🎜🎜🎜--optimize
- 剥离你程序中的每一个兼容PSR-0 和 PSR-4 的类。
--no-dev
- 排除那些你只在开发环境下使用的类(如tests)。
--classmap-authoritative
- 防止Composer在文件系统中寻找那些没有出现在类映射中的类。
--optimize
用APC缓存Autoloader ¶
另一个方案是在类被首次定位之再来缓存其位置。Symfony自带了一个类 - ApcClassLoader
- 专门用来干这个。要使用它,只需适配你的前端控制器文件。如果你使用了标准版框架,可作出以下改变:
1
更多细节,参考 对Class Loader进行缓存 一文。
当使用APC autoloader时,如果你添加了新类,它们将被自动找到,所有东西的运作一如往常(即,并无必要“清除”缓存)。但是,如果你改变了某个特定命名空间或前缀的位置,你就需要flush你的APC缓存。否则,自动加载器仍将在那个命名空间的旧位置来寻找所有的类。
使用Bootstrap文件 ¶
为确保弹性优化和代码复用,Symfony程序利用了多样化的类和第三方组件。但在每次请求中从分散位置加载全部这些类会导致一定程度的过载。为减轻负责,Symfony提供了一个脚本来生成一个被称为 bootstrap file 文件,考量的是在单一文件中加载多个类定义。通过包容这个文件 (它包含了各种核心类的拷贝),Symfony不再需要包容任何“含有那些类”的源文件。这将减少不少的硬盘吞吐(disc IO)。
如果你正在使用Symfony标准版,那你应该已经使用了这个bootstrap启动文件。为确保使用,打开你的前端控制器(通常是 app.php
Supprimez toutes les classes compatibles PSR-0 et PSR-4 de votre programme.
--no-dev
--classmap-authoritative
Utilisez les fichiers Bootstrap ¶Pour garantir une optimisation flexible et une réutilisation du code, Symfony The Le programme utilise un large éventail de classes et de composants tiers. Mais le chargement de toutes ces classes à partir d’emplacements dispersés à chaque requête entraîne un certain niveau de surcharge. Pour réduire les responsabilités, Symfony fournit un script pour générer un bootstrap appelé fichier a>, envisage de charger plusieurs définitions de classe dans un seul fichier. En incluant ce fichier (qui contient des copies de diverses classes principales), Symfony n'a plus besoin d'inclure de fichiers sources contenant ces classes. Cela réduira considérablement le débit du disque dur (disque IO). |
Notez qu'il y a deux inconvénients à utiliser des fichiers bootstrap :
- Ce fichier sera régénéré lorsque des ressources d'origine changent (par exemple, lorsque vous mettez à jour le code src de Symfony ou la bibliothèque de classes tierce du fournisseur)
- Lors du débogage ; , les développeurs doivent définir des points d'arrêt dans le fichier d'amorçage.
Si vous utilisez la version standard de Symfony, le fichier de démarrage sera automatiquement reconstruit via la commande composer install
après la mise à jour de la bibliothèque de classes du fournisseur (Annotation : fait référence à composer. json Post, etc. peuvent également être exécutés manuellement)composer install
命令来自动重建(译注:指composer.json中的post脚本等,也可手动执行)
Bootstrap文件和Byte Code缓存 ¶
即便使用了一种byte code缓存,在使用bootstrap文件时仍会提高性能,这是因为需要监控“发生改变”的文件变少了。当然这个功能如果在byte code cache中被关闭的话 (即在APC中设置 apc.stat=0
Fichier Bootstrap et cache Byte Code ¶
Même l'utilisation d'un cache de code d'octet améliore toujours les performances lors de l'utilisation de fichiers d'amorçage, car il y a moins de fichiers à surveiller pour les "modifications". Bien sûr, si cette fonction est désactivée dans le cache du byte code (c'est-à-dire en définissantapc.stat=0
dans APC), il n'y aura aucune raison d'utiliser le fichier d'amorçage. .