”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 提高 PHP 效率:经过验证的性能优化技术

提高 PHP 效率:经过验证的性能优化技术

发布于2024-11-08
浏览:958

Boosting PHP Efficiency: Proven Techniques for Performance Optimization

优化 PHP 性能可确保我们的 Web 应用程序平稳运行、快速响应并有效处理流量。下面是关于如何有效地最大化 PHP 性能的详细分步指南,并为每个优化策略提供了实践示例。


第 1 部分:更新到最新的稳定 PHP 版本

第 1 步:检查当前 PHP 版本

首先检查系统上安装的当前 PHP 版本:

php -v

如果您的版本已过时,升级到最新的稳定 PHP 版本通常会带来性能改进和新功能。

第 2 步:升级 PHP(如果需要)

要安装最新的 PHP 版本,请在 Ubuntu 上运行以下命令:

sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt install php8.2 # Replace with the latest version

为什么?

每个新的 PHP 版本都会带来性能提升。例如,与 PHP 5.x 相比,PHP 7.x 的执行时间提高了近 50%,而 PHP 8.x 也有进一步显着的改进。


第 2 部分:使用操作码缓存 (PHP Opcache)

第 1 步:在 PHP 中启用 Opcache

Opcache 将预编译的脚本字节码存储在内存中,减少了 PHP 在每个请求上加载和解析脚本的需要。要启用它:

  1. 打开您的 php.ini 文件:
   sudo nano /etc/php/8.2/fpm/php.ini # Use your PHP version
  1. 找到 Opcache 设置并启用它:
   opcache.enable=1
   opcache.memory_consumption=128
   opcache.max_accelerated_files=10000
   opcache.revalidate_freq=0
  1. 重新启动 PHP-FPM 和 Nginx:
   sudo systemctl restart php8.2-fpm
   sudo systemctl restart nginx

为什么?

Opcache 无需在每个请求上编译 PHP 代码,从而显着提高性能,从而显着减少 CPU 使用率和请求时间。


第 3 部分:优化数据库查询

第 1 步:为数据库表建立索引

不正确的数据库索引会减慢查询执行速度。确保对 WHERE 子句中使用的列或用于排序的列建立索引。

MySQL 查询示例:

CREATE INDEX idx_user_email ON users(email);

第 2 步:使用查询分析

分析您的数据库查询以查找瓶颈。例如,Laravel 的 Eloquent ORM 允许查询分析:

DB::enableQueryLog();
$users = DB::table('users')->get();
dd(DB::getQueryLog());

为什么?

通过优化数据库查询并对关键列建立索引,您可以大大减少查询执行时间,从而加快 PHP 应用程序的速度。


第 4 部分:启用 Gzip 压缩

第 1 步:在 Nginx 中启用 Gzip

Gzip 减少了从服务器发送到客户端的数据大小,从而使页面加载速度更快。要在 Nginx 中启用它:

  1. 打开Nginx配置文件:
   sudo nano /etc/nginx/nginx.conf
  1. 添加以下 Gzip 设置:
   gzip on;
   gzip_comp_level 2;
   gzip_types text/css application/javascript application/json image/svg xml;
   gzip_min_length 256;
  1. 保存并重启Nginx:
   sudo systemctl restart nginx

为什么?

启用 Gzip 压缩可减少需要传输的数据量,从而加快页面加载时间并减少带宽使用。


第 5 部分:使用内容交付网络 (CDN)

步骤 1:为静态资产配置 CDN

Cloudflare 或 Amazon CloudFront 等 CDN 在全球分布式服务器上存储 CSS、JavaScript 和图像等静态资产的副本,使它们更接近用户。

例子:


为什么?

通过将静态内容卸载到 CDN,您可以减少服务器上的负载,并显着缩短全球用户的响应时间。


第 6 部分:使用 PHP-FPM 和调优

第1步:安装并配置PHP-FPM

确保您使用的是 PHP-FPM (FastCGI Process Manager),它针对高负载环境进行了更好的优化:

sudo apt install php8.2-fpm

第 2 步:调整 PHP-FPM 设置

您可以通过调整 PHP-FPM 池配置文件中的 pm.max_children、pm.start_servers、pm.min_spare_servers 和 pm.max_spare_servers 设置来调整 PHP-FPM 设置以有效地处理更多请求。

编辑池配置文件:

sudo nano /etc/php/8.2/fpm/pool.d/www.conf

根据可用内存和流量增加 pm.max_children:

pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

重启 PHP-FPM 和 Nginx:

sudo systemctl restart php8.2-fpm
sudo systemctl restart nginx

为什么?

PHP-FPM 允许您的 PHP 进程高效处理更多并发请求,减少重负载下的服务器响应时间。


第 7 部分:缩小和捆绑资产

第 1 步:缩小 CSS、JavaScript 和 HTML

通过删除不必要的空格和注释来缩小 CSS、JavaScript 和 HTML 文件,从而减少文件大小。

使用 Laravel MixGulp:
等工具

npm install laravel-mix --save-dev

Laravel 的示例 webpack.mix.js 文件:

const mix = require('laravel-mix');

mix.js('resources/js/app.js', 'public/js')
    .sass('resources/sass/app.scss', 'public/css')
    .minify('public/js/app.js')
    .minify('public/css/app.css');

第 2 步:启用浏览器缓存

在 Nginx 配置文件中,添加静态资源的缓存:

location ~* \.(css|js|jpg|jpeg|png|gif|ico|woff|woff2)$ {
    expires 1y;
    access_log off;
    add_header Cache-Control "public";
}

为什么?

缩小和捆绑资源,并启用浏览器缓存,可以减小文件大小并缩短加载时间,从而提高应用程序速度。


第 8 部分:使用 Redis 或 Memcached 进行缓存

第1步:安装Redis

安装Redis:

sudo apt install redis-server

第 2 步:配置 Laravel 以使用 Redis

在 Laravel 中,打开 .env 文件并将 Redis 配置为缓存驱动程序:

CACHE_DRIVER=redis

第 3 步:缓存数据库查询

使用查询缓存来加速重复的数据库查询:

$users = Cache::remember('users', 60, function() {
    return DB::table('users')->get();
});

为什么?

通过缓存数据库查询,您可以减少数据库负载并显着缩短频繁访问数据的响应时间。


第 9 部分:优化自动加载器

第 1 步:使用 Composer 的 Autoloader 优化

优化 Composer 自动加载器以进行生产:

composer install --optimize-autoloader --no-dev

第 2 步:清除未使用的服务提供商

在 Laravel 中,禁用 config/app.php 中任何未使用的服务提供程序,以减少内存使用并加快应用程序启动时间。

为什么?

自动加载优化编译类映射,使类加载更快。禁用未使用的服务有助于应用程序使用更少的资源。


第 10 部分:监控和分析

第 1 步:使用 Laravel Telescope(或其他分析工具)

安装 Laravel Telescope 来分析您的应用程序:

composer require laravel/telescope
php artisan telescope:install
php artisan migrate
php artisan serve

第 2 步:使用 New Relic 或 Blackfire 进行高级分析

您可以集成New RelicBlackfire等第三方工具来分析应用程序瓶颈、数据库性能等。

为什么?

监控和分析工具可帮助识别 PHP 应用程序中的缓慢查询、内存泄漏和瓶颈,使您能够主动修复性能问题。


结论:

通过执行这些步骤,您可以显着提高 PHP 应用程序的性能。从更新 PHP 和启用操作码缓存到优化数据库查询和配置 PHP-FPM,每一步都有助于提高应用程序的响应速度和可扩展性。

版本声明 本文转载于:https://dev.to/mdarifulhaque/boosting-php-efficiency-proven-techniques-for-performance-optimization-4plh?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 如何使用PHP从XML文件中有效地检索属性值?
    如何使用PHP从XML文件中有效地检索属性值?
    从php $xml = simplexml_load_file($file); foreach ($xml->Var[0]->attributes() as $attributeName => $attributeValue) { echo $attributeName,...
    编程 发布于2025-05-11
  • 如何使用Python有效地以相反顺序读取大型文件?
    如何使用Python有效地以相反顺序读取大型文件?
    在python 中,如果您使用一个大文件,并且需要从最后一行读取其内容,则在第一行到第一行,Python的内置功能可能不合适。这是解决此任务的有效解决方案:反向行读取器生成器 == ord('\ n'): 缓冲区=缓冲区[:-1] ...
    编程 发布于2025-05-11
  • PHP未来:适应与创新
    PHP未来:适应与创新
    PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。 引言在编程世界中,PHP一直是网页开发的中流砥柱。作为一个从1994年就开始发展...
    编程 发布于2025-05-11
  • 对象拟合:IE和Edge中的封面失败,如何修复?
    对象拟合:IE和Edge中的封面失败,如何修复?
    To resolve this issue, we employ a clever CSS solution that solves the problem:position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%)...
    编程 发布于2025-05-11
  • 在Python中如何创建动态变量?
    在Python中如何创建动态变量?
    在Python 中,动态创建变量的功能可以是一种强大的工具,尤其是在使用复杂的数据结构或算法时,Dynamic Variable Creation的动态变量创建。 Python提供了几种创造性的方法来实现这一目标。利用dictionaries 一种有效的方法是利用字典。字典允许您动态创建密钥并分...
    编程 发布于2025-05-11
  • 为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    为什么我在Silverlight Linq查询中获得“无法找到查询模式的实现”错误?
    查询模式实现缺失:解决“无法找到”错误在Silverlight应用程序中,尝试使用LINQ建立LINQ连接以错误而实现的数据库”,无法找到查询模式的实现。”当省略LINQ名称空间或查询类型缺少IEnumerable 实现时,通常会发生此错误。 解决问题来验证该类型的质量是至关重要的。在此特定实例中...
    编程 发布于2025-05-11
  • HTML格式标签
    HTML格式标签
    HTML 格式化元素 **HTML Formatting is a process of formatting text for better look and feel. HTML provides us ability to format text without us...
    编程 发布于2025-05-11
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-05-11
  • 为什么尽管有效代码,为什么在PHP中捕获输入?
    为什么尽管有效代码,为什么在PHP中捕获输入?
    在php ;?>" method="post">The intention is to capture the input from the text box and display it when the submit button is clicked.但是,输出...
    编程 发布于2025-05-11
  • 在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    在Java中使用for-to-loop和迭代器进行收集遍历之间是否存在性能差异?
    For Each Loop vs. Iterator: Efficiency in Collection TraversalIntroductionWhen traversing a collection in Java, the choice arises between using a for-...
    编程 发布于2025-05-11
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-05-11
  • C++中如何将独占指针作为函数或构造函数参数传递?
    C++中如何将独占指针作为函数或构造函数参数传递?
    在构造函数和函数中将唯一的指数管理为参数 unique pointers( unique_ptr [2启示。通过值: base(std :: simelor_ptr n) :next(std :: move(n)){} 此方法将唯一指针的所有权转移到函数/对象。指针的内容被移至功能中,在操作...
    编程 发布于2025-05-11
  • 哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    哪种方法更有效地用于点 - 填点检测:射线跟踪或matplotlib \的路径contains_points?
    在Python Matplotlib's path.contains_points FunctionMatplotlib's path.contains_points function employs a path object to represent the polygon.它...
    编程 发布于2025-05-11
  • Python中嵌套函数与闭包的区别是什么
    Python中嵌套函数与闭包的区别是什么
    嵌套函数与python 在python中的嵌套函数不被考虑闭合,因为它们不符合以下要求:不访问局部范围scliables to incling scliables在封装范围外执行范围的局部范围。 make_printer(msg): DEF打印机(): 打印(味精) ...
    编程 发布于2025-05-11
  • 您如何在Laravel Blade模板中定义变量?
    您如何在Laravel Blade模板中定义变量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配变量对于存储以后使用的数据至关重要。在使用“ {{}}”分配变量的同时,它可能并不总是最优雅的解决方案。幸运的是,Blade通过@php Directive提供了更优雅的方法: $ old_section =“...
    编程 发布于2025-05-11

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3