Heim > Artikel > PHP-Framework > Helfen Sie dabei, die Leistung von ThinkPHP-Anwendungen effektiv zu verbessern!
In der folgenden Framework-Tutorial-Kolumne erfahren Sie, wie Sie die Anwendungsleistung von ThinkPHP effektiv verbessern können. Ich hoffe, dass es für Freunde in Not hilfreich ist!
Wenn es um die Anwendungsleistung geht, spielen zu viele Aspekte eine Rolle. Es gibt viele Artikel online über Serveroptimierung und Frontend-Optimierung, daher werde ich hier nicht näher darauf eingehen. In diesem Artikel werden nur kurz einige Methoden und Vorsichtsmaßnahmen zur Leistungsoptimierung vorgestellt, die bei der Entwicklung von ThinkPHP5.1
-Anwendungen (insbesondere der Bereitstellungsumgebung) eine Rolle spielen können. Empfohlen: „Video-Tutorial zur Weltpremiere von ThinkPHP 5.1
"5.1
应用开发中(尤其是部署环境)可能涉及的一些性能优化手段和注意事项。推荐:《ThinkPHP 5.1全球首发视频教程》
首先要强调一点:框架并不是应用性能的瓶颈,架构设计、数据库和人才是。框架在设计之初,出于通用性考虑,不会特意针对某个应用做深入优化,但提供了一些可能的手段和配置参数让你进行针对性的调优,下面就列举一些可能的优化手段,在开发的时候可以根据情况调整。
正确的性能优化步骤应该是:架构优化、数据库优化、代码优化。
1. 架构优化
架构优化涉及到技术、存储、网络、服务的选型和构架,尽量使用成熟和现代的开发架构和设计模式。前后端完全分离设计,便于前后端的独立优化,也更加便于测试工作。
如果你的应用遇到了性能瓶颈,这个时候要考虑的就是优化架构而不是优化代码本身,因为架构层面的优化效果往往是最显著的。
2. 关闭调试模式
部署环境千万不要忘记关闭调试模式,这不仅仅是出于性能考虑,更多是基于安全因素。事实上,建议通过环境变量来配置关闭调试模式,这样部署后不需要更改任何配置文件。
因为调试模式影响日志记录信息、额外的调试信息和缓存失效,关闭调试模式能够带来一定的性能提升。
3. 使用单模块
使用多模块功能会增加文件的
I/O
开销和额外的配置及检查,如非必要在规划你的应用架构的时候尽量考虑使用单一模块,然后使用控制器分级来解决控制器过多的问题。使用单一模块的性能优势,在部署到
swoole
Lassen Sie zunächst einmal Ich möchte einen Punkt betonen: Das Framework ist nicht der Engpass der Anwendungsleistung, Architekturdesign, Datenbank und Talent sind es. Aus Gründen der Vielseitigkeit führt das Framework zu Beginn des Entwurfs keine detaillierte Optimierung für eine bestimmte Anwendung durch, stellt jedoch einige mögliche Mittel und Konfigurationsparameter bereit, mit denen Sie eine gezielte Optimierung durchführen können . , die je nach Situation während der Entwicklung angepasst werden kann.
1. Architekturoptimierung
Architekturoptimierung umfasst die Auswahl und Architektur von Technologie, Speicher, Netzwerk und Diensten. Versuchen Sie, ausgereifte und moderne Entwicklungsarchitektur und Designmuster zu verwenden. Das Front-End und das Back-End sind so konzipiert, dass sie vollständig getrennt sind, was eine unabhängige Optimierung von Front-End und Back-End ermöglicht und das Testen erleichtert.
Wenn Ihre Anwendung auf einen Leistungsengpass stößt, müssen Sie zu diesem Zeitpunkt über die Optimierung der Architektur und nicht über die Optimierung des Codes selbst nachdenken, da der Optimierungseffekt auf Architekturebene häufig am bedeutendsten ist.
2. Deaktivieren Sie den Debugging-Modus.
Da sich der Debugging-Modus auf Protokollierungsinformationen, zusätzliche Debugging-Informationen und die Cache-Ungültigmachung auswirkt, kann das Deaktivieren des Debugging-Modus bestimmte Leistungsverbesserungen mit sich bringen.
3. Die Verwendung eines einzelnen Moduls
I/O
-Overhead der Datei und erfordert zusätzliche Konfiguration und Überprüfung. Wenn dies nicht erforderlich ist, sollten Sie die Verwendung eines einzelnen Moduls in Betracht ziehen Modul bei der Planung Ihrer Anwendungsarchitekturmodule und verwenden Sie dann die Controller-Einstufung, um das Problem zu vieler Controller zu lösen.
Die Leistungsvorteile der Verwendung eines einzelnen Moduls können bei der Bereitstellung in swoole
besser zum Ausdruck kommen, da die Anwendungsdatei, sobald sie den Dienst startet, in den Speicher geladen wird und die zugehörigen Dateien des Das Modul wird bei jeder Neuladeanfrage geladen.
4. Routing-Design und -Optimierung
Versuchen Sie, Vorgänge wie Datenüberprüfung und Berechtigungsprüfung der aktuellen Route im Routing zu entwerfen. Einerseits ist es relativ klar, andererseits kann der Überprüfungsvorgang so früh wie möglich durchgeführt werden Der Controller soll ausgeführt werden.
Aktivieren Sie die verzögerte Auflösung von Routen, wenn viele Gruppen vorhanden sind.
// 开启路由延迟解析 'url_lazy_route' => true,Wenn es viele Routing-Regeln unter derselben Gruppe gibt, wird empfohlen, die Routing-Regeln zusammenzuführen.
// 合并分组路由规则 'route_rule_merge' => true,Für das Routing von GET-Anfragen können Sie den Routing-Anfrage-Cache festlegen.
// 定义GET请求路由规则 并设置3600秒的缓存 Route::get('new/:id','News/read')->cache(3600);🎜 Während der Bereitstellungsphase kann das Routen-Caching aktiviert werden. 🎜🎜
// 开启路由缓存(仅部署模式有效) 'route_check_cache' => true,🎜5. Abfrageoptimierung🎜🎜🎜Behalten Sie zunächst gute Entwicklungsgewohnheiten bei und verstehen Sie den korrekten Nutzungsstatus von Datenbankklassen und -modellen. Zur Leistungsoptimierung der Datenbank selbst können Sie sich auf die 21 besten Erfahrungen mit der MySQL-Leistung beziehen Im Folgenden geht es hauptsächlich um die Framework-Optimierungsstrategien im Zusammenhang mit der Datenabfrage. 🎜🎜Abfrage-Cache sinnvoll nutzen🎜🎜Reduzieren Sie die Anzahl der Abfragen pro Anfrage so weit wie möglich und planen Sie den Datenabfrage-Cache sinnvoll für Datenabfragen, die keine hohe Echtzeitleistung erfordern (verwenden Sie vorzugsweise den Redis-Cache). 🎜
Blog::where('id', 10) ->cache(30) ->find();🎜Wenn eine zugehörige Abfrage verwendet wird, kann die Cache-Methode nur zum Daten-Caching des Hauptmodells verwendet werden, Sie können jedoch die Remember-Methode der Cache-Klasse zum bequemen Daten-Caching verwenden. 🎜🎜
$users = Cache::remember('users', function(){ return User::with('profile') ->where('status', 1) ->select();},30);🎜Seien Sie nicht zu sehr mit der Anzahl der Abfragen beschäftigt🎜🎜🎜Die Anzahl der Abfragen so weit wie möglich zu reduzieren, geschieht aus Leistungsgründen, ist aber nicht notwendig, um die höchste Leistung zu erzielen. Die Leistung einer komplexen JOIN-Abfrage ist möglicherweise nicht so hoch wie die von zwei einfachen Abfragen, aber die Verwendung einfacher Abfragen ist klarer und verständlicher und das Zwischenspeichern von Datenabfragen ist bequemer. 🎜
不要总是以为模型的性能一定比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
更多用法可以参考官方手册的数据字段缓存。
每次在应用初始化或者模块初始化的时候会有一定的I/O开销,如果已经开启OpCache的话对性能影响甚微,如果比较在意的也可以通过命令行指令生成配置缓存(包括相关的公共文件和各种定义文件)。
生成应用配置缓存:
php think optimize:config
生成模块配置缓存:
php think optimize:config index
注意:一旦配置或者公共文件发生变化,必须重新生成。
类库映射可以提升类库的自动加载性能,使用下面的指令可以生成系统类库和应用类库的类库映射(包括extend目录下的类库)。
php think optimize:autoload
vendor目录下的类库可以使用composer的dump-autoload指令优化加载性能。
composer dump-autoload -o
该命令把 PSR-0 和 PSR-4 转换为一个类映射表,来提高类的加载速度。
Das obige ist der detaillierte Inhalt vonHelfen Sie dabei, die Leistung von ThinkPHP-Anwendungen effektiv zu verbessern!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!