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

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

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

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]删除
最新教程 更多>
  • 编译器报错“usr/bin/ld: cannot find -l”解决方法
    编译器报错“usr/bin/ld: cannot find -l”解决方法
    错误:“ usr/bin/ld:找不到-l “ 此错误表明链接器在链接您的可执行文件时无法找到指定的库。为了解决此问题,我们将深入研究如何指定库路径并将链接引导到正确位置的详细信息。添加库搜索路径的一个可能的原因是,此错误是您的makefile中缺少库搜索路径。要解决它,您可以在链接器命令中添加...
    编程 发布于2025-07-03
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-07-03
  • 为什么尽管有效代码,为什么在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-07-03
  • 如何使用node-mysql在单个查询中执行多个SQL语句?
    如何使用node-mysql在单个查询中执行多个SQL语句?
    Multi-Statement Query Support in Node-MySQLIn Node.js, the question arises when executing multiple SQL statements in a single query using the node-mys...
    编程 发布于2025-07-03
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-07-03
  • 如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在Java中正确显示“ DD/MM/YYYY HH:MM:SS.SS”格式的当前日期和时间?
    如何在“ dd/mm/yyyy hh:mm:mm:ss.ss”格式“ gormat 解决方案: args)抛出异常{ 日历cal = calendar.getInstance(); SimpleDateFormat SDF =新的SimpleDateFormat(“...
    编程 发布于2025-07-03
  • 如何在Chrome中居中选择框文本?
    如何在Chrome中居中选择框文本?
    选择框的文本对齐:局部chrome-inly-ly-ly-lyly solument 您可能希望将文本中心集中在选择框中,以获取优化的原因或提高可访问性。但是,在CSS中的选择元素中手动添加一个文本 - 对属性可能无法正常工作。初始尝试 state)</option> < op...
    编程 发布于2025-07-03
  • 在GO中构造SQL查询时,如何安全地加入文本和值?
    在GO中构造SQL查询时,如何安全地加入文本和值?
    在go中构造文本sql查询时,在go sql queries 中,在使用conting and contement和contement consem per时,尤其是在使用integer per当per当per时,per per per当per. [&​​&&&&&&&&&&&&&&&默元组方法在...
    编程 发布于2025-07-03
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-07-03
  • Java中假唤醒真的会发生吗?
    Java中假唤醒真的会发生吗?
    在Java中的浪费唤醒:真实性或神话?在Java同步中伪装唤醒的概念已经是讨论的主题。尽管存在这种行为的潜力,但问题仍然存在:它们实际上是在实践中发生的吗? Linux的唤醒机制根据Wikipedia关于伪造唤醒的文章,linux实现了pthread_cond_wait()功能的Linux实现,利用...
    编程 发布于2025-07-03
  • 左连接为何在右表WHERE子句过滤时像内连接?
    左连接为何在右表WHERE子句过滤时像内连接?
    左JOIN CONUNDRUM:WITCHING小时在数据库Wizard的领域中变成内在的加入很有趣,当将c.foobar条件放置在上面的Where子句中时,据说左联接似乎会转换为内部连接。仅当满足A.Foo和C.Foobar标准时,才会返回结果。为什么要变形?关键在于其中的子句。当左联接的右侧值...
    编程 发布于2025-07-03
  • 用户本地时间格式及时区偏移显示指南
    用户本地时间格式及时区偏移显示指南
    在用户的语言环境格式中显示日期/时间,并使用时间偏移在向最终用户展示日期和时间时,以其localzone and格式显示它们至关重要。这确保了不同地理位置的清晰度和无缝用户体验。以下是使用JavaScript实现此目的的方法。方法:推荐方法是处理客户端的Javascript中的日期/时间格式化和时...
    编程 发布于2025-07-03
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-07-03
  • 如何有效地转换PHP中的时区?
    如何有效地转换PHP中的时区?
    在PHP 利用dateTime对象和functions DateTime对象及其相应的功能别名为时区转换提供方便的方法。例如: //定义用户的时区 date_default_timezone_set('欧洲/伦敦'); //创建DateTime对象 $ dateTime = ne...
    编程 发布于2025-07-03
  • Go web应用何时关闭数据库连接?
    Go web应用何时关闭数据库连接?
    在GO Web Applications中管理数据库连接很少,考虑以下简化的web应用程序代码:出现的问题:何时应在DB连接上调用Close()方法?,该特定方案将自动关闭程序时,该程序将在EXITS EXITS EXITS出现时自动关闭。但是,其他考虑因素可能保证手动处理。选项1:隐式关闭终止数...
    编程 发布于2025-07-03

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

Copyright© 2022 湘ICP备2022001581号-3