Maison  >  Article  >  cadre php  >  Vous aider à améliorer efficacement les performances des applications ThinkPHP !

Vous aider à améliorer efficacement les performances des applications ThinkPHP !

藏色散人
藏色散人avant
2020-12-03 14:41:112846parcourir

Ce qui suit est la colonne du didacticiel du framework thinkphp pour vous présenter comment améliore efficacement les performances de l'application ThinkPHP, j'espère que cela sera utile aux amis dans le besoin !

Vous aider à améliorer efficacement les performances des applications ThinkPHP !

En ce qui concerne les performances des applications, trop d'aspects sont impliqués. Il existe de nombreux articles en ligne sur l'optimisation des serveurs et l'optimisation du front-end, je n'entrerai donc pas dans les détails. détails ici. Cet article ne présente que brièvement certaines méthodes d'optimisation des performances et précautions qui peuvent être impliquées dans le développement d'applications ThinkPHP 5.1 (en particulier l'environnement de déploiement).

Recommandé : "Tutoriel vidéo ThinkPHP 5.1 Première mondiale"

Tout d'abord, nous devons souligner que le framework n'est pas le goulot d'étranglement des performances des applications, de l'architecture conception, base de données et talent oui. Au début de la conception du framework, par souci de polyvalence, il n'effectuera pas spécifiquement d'optimisation en profondeur pour une application donnée, mais il fournit quelques moyens et paramètres de configuration possibles pour vous permettre d'effectuer des réglages ciblés. Voici quelques-uns des possibles. des moyens d'optimisation, qui peuvent être ajustés en fonction de la situation lors du développement.

Les étapes correctes d'optimisation des performances doivent être : l'optimisation de l'architecture, l'optimisation de la base de données et l'optimisation du code.

1. Optimisation de l'architecture

L'optimisation de l'architecture implique la sélection et l'architecture de la technologie, du stockage, du réseau et des services, et essaie d'utiliser une architecture de développement et des modèles de conception matures et modernes. Le front-end et le back-end sont conçus pour être complètement séparés, ce qui facilite une optimisation indépendante du front-end et du back-end et facilite les tests.

Si votre application rencontre un goulot d'étranglement en termes de performances, ce que vous devez considérer à ce stade est d'optimiser l'architecture plutôt que d'optimiser le code lui-même, car l'effet d'optimisation au niveau architectural est souvent le plus important.

2. Désactivez le mode débogage

N'oubliez pas de désactiver le mode débogage dans l'environnement de déploiement. Ce n'est pas seulement pour des raisons de performances, mais aussi pour des raisons de sécurité. En fait, il est recommandé de configurer le mode débogage pour qu'il soit désactivé via des variables d'environnement, afin qu'aucun fichier de configuration ne doive être modifié après le déploiement.

Étant donné que le mode de débogage affecte les informations de journalisation, les informations de débogage supplémentaires et l'invalidation du cache, la désactivation du mode de débogage peut apporter certaines améliorations de performances.

3. L'utilisation d'un seul module

L'utilisation de la fonction multi-module augmentera la surcharge du fichier I/O et une configuration et une vérification supplémentaires. Si cela n'est pas nécessaire, essayez d'envisager de l'utiliser lors de la planification. votre architecture d'application. Module unique, puis utilisez la classification des contrôleurs pour résoudre le problème du trop grand nombre de contrôleurs.

Les avantages en termes de performances de l'utilisation d'un seul module peuvent être plus pleinement reflétés lorsqu'il est déployé sur swoole, car une fois que le fichier d'application démarre le service, il sera chargé dans la mémoire et les fichiers associés du module sera chargé à chaque fois que vous demanderez un rechargement.

4. Conception et optimisation du routage

Lors de la définition des règles de routage, n'utilisez pas de tableaux, essayez d'utiliser des méthodes pour enregistrer les routes et utilisez plus souvent des groupes de routage (ou routage de ressources). Le routage de groupe peut réduire le nombre de correspondances d'itinéraire, améliorant ainsi les performances de routage. Si vous disposez de routes différentes pour plusieurs noms de domaine, vous devez également prévoir d'utiliser des routes basées sur les noms de domaine.

Concevoir autant que possible les opérations telles que la vérification des données et la vérification des autorisations de l'itinéraire actuel dans le routage. D'une part, c'est relativement clair. D'autre part, les opérations de vérification peuvent être effectuées aussi. le plus tôt possible sans attendre l'exécution du contrôleur.

Activer la résolution différée des itinéraires lorsqu'il existe de nombreux groupes.

// 开启路由延迟解析
'url_lazy_route'    => true,

S'il existe plusieurs règles de routage sous le même groupe, il est recommandé de fusionner les règles de routage.

// 合并分组路由规则
'route_rule_merge'       => true,

Pour le routage des requêtes GET, vous pouvez définir le cache de requêtes du routage.

// 定义GET请求路由规则 并设置3600秒的缓存
Route::get('new/:id','News/read')->cache(3600);

Pendant la phase de déploiement, la mise en cache des routes peut être activée.

// 开启路由缓存(仅部署模式有效)
'route_check_cache'	=>	true,

5. Optimisation des requêtes

Tout d'abord, maintenez de bonnes habitudes de développement et comprenez la posture d'utilisation correcte des classes et des modèles Db pour l'optimisation des performances de la base de données elle-même. , vous pouvez vous référer à l'optimisation des performances MySQL. Les 21 meilleures expériences, les suivantes sont principalement des stratégies d'optimisation liées aux requêtes de données dans le framework.

Utilisez le cache de requêtes de manière appropriée

Essayez de réduire le nombre de requêtes par requête et planifiez rationnellement le cache de requêtes de données pour les requêtes de données qui ne nécessitent pas de performances en temps réel élevées (le cache Redis est préféré).

Blog::where('id', 10)
    ->cache(30)
    ->find();

Si des requêtes associées sont utilisées, la méthode cache ne peut être utilisée que pour la mise en cache des données du modèle principal, mais vous pouvez utiliser la méthode Remember de la classe Cache pour une mise en cache pratique des données.

$users = Cache::remember('users', function(){
    return User::with('profile')
        ->where('status', 1)
        ->select();},30);

Ne vous inquiétez pas trop du nombre de requêtes

Minimiser le nombre de requêtes est pour des raisons de performances, mais ce n'est pas nécessaire d'utiliser le moins de requêtes. ne signifie pas nécessairement les performances les plus élevées. Les performances d'une requête JOIN complexe ne sont peut-être pas aussi élevées que celles de deux requêtes simples, mais l'utilisation de requêtes simples est plus claire et plus facile à comprendre, et il est plus pratique de mettre en cache les requêtes de données.

正确使用模型关联

不要总是以为模型的性能一定比Db类低,框架的ORM查询设计经过了较为合理的优化,正确使用模型一样可以有出色的性能,而且比Db查询要方便很多。

尤其是对于一些复杂的设计来说使用模型关联显得比直接用Db更加简单,例如使用关联预载入查询就可以避免N+1查询问题。

User::with(['profile','book'])->select();

如果用Db类自己实现的话,费时费力,性能还不一定优。

大量数据处理优化

对于大量数据的处理操作,使用chunk分批处理方法。

User::chunk(100, function($users) {
    foreach ($users as $user) {
        // 处理数据
    }});

对于内存开销比较大的应用,在做大量数据查询和处理的时候,使用cursor方法,可以利用PHP的生成器特性,减少内存占用。

$cursor = User::cursor();foreach($cursor as $user){
    // 处理数据
    }

你会发现用户数据不论是1万还是10万级别,内存开销并没有大的变化。

涉及到对大量数据的处理,包括数据迁移、批量更新,尽量使用命令行指令运行,否则会因为超时而中断。

善用数据集方法避免多次查询

可以通过数据集的方法完成的子集或者排序操作不要再次查询,例如:

// 模型查询返回数据集对象
$users = User::select();
// 按照用户的成绩由高到低排序
$list1 = $users->order('score', 'desc');
// 筛选成绩在90分以上的用户
$list2 = $users->where('score', '>=', 90);

字段缓存

利用下面指令在部署后生成字段缓存,可以减少每次数据表的字段查询开销。

php think optimize:schema

更多用法可以参考官方手册的数据字段缓存。

6.0 配置和公共文件缓存

每次在应用初始化或者模块初始化的时候会有一定的I/O开销,如果已经开启OpCache的话对性能影响甚微,如果比较在意的也可以通过命令行指令生成配置缓存(包括相关的公共文件和各种定义文件)。

生成应用配置缓存:

php think optimize:config

生成模块配置缓存:

php think optimize:config index

注意:一旦配置或者公共文件发生变化,必须重新生成。

7.0 生成类库映射

类库映射可以提升类库的自动加载性能,使用下面的指令可以生成系统类库和应用类库的类库映射(包括extend目录下的类库)。

php think optimize:autoload

vendor目录下的类库可以使用composer的dump-autoload指令优化加载性能。

composer dump-autoload -o

该命令把 PSR-0 和 PSR-4 转换为一个类映射表,来提高类的加载速度。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer