」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 提高 PHP 效率:經過驗證的效能最佳化技術

提高 PHP 效率:經過驗證的效能最佳化技術

發佈於2024-11-08
瀏覽:604

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]刪除
最新教學 更多>
  • 如何使用不同數量列的聯合數據庫表?
    如何使用不同數量列的聯合數據庫表?
    合併列數不同的表 當嘗試合併列數不同的數據庫表時,可能會遇到挑戰。一種直接的方法是在列數較少的表中,為缺失的列追加空值。 例如,考慮兩個表,表 A 和表 B,其中表 A 的列數多於表 B。為了合併這些表,同時處理表 B 中缺失的列,請按照以下步驟操作: 確定表 B 中缺失的列,並將它們添加到表的...
    程式設計 發佈於2025-05-09
  • 您如何在Laravel Blade模板中定義變量?
    您如何在Laravel Blade模板中定義變量?
    在Laravel Blade模板中使用Elegance 在blade模板中如何分配變量對於存儲以後使用的數據至關重要。在使用“ {{}}”分配變量的同時,它可能並不總是最優雅的解決方案。 幸運的是,Blade通過@php Directive提供了更優雅的方法: $ old_section =...
    程式設計 發佈於2025-05-09
  • 為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    為什麼在我的Linux服務器上安裝Archive_Zip後,我找不到“ class \” class \'ziparchive \'錯誤?
    class'ziparchive'在Linux Server上安裝Archive_zip時找不到錯誤 commant in lin ins in cland ins in lin.11 on a lin.1 in a lin.11錯誤:致命錯誤:在... cass中找不到類z...
    程式設計 發佈於2025-05-09
  • 如何簡化PHP中的JSON解析以獲取多維陣列?
    如何簡化PHP中的JSON解析以獲取多維陣列?
    php 試圖在PHP中解析JSON數據的JSON可能具有挑戰性,尤其是在處理多維數組時。 To simplify the process, it's recommended to parse the JSON as an array rather than an object.To do...
    程式設計 發佈於2025-05-09
  • 如何在其容器中為DIV創建平滑的左右CSS動畫?
    如何在其容器中為DIV創建平滑的左右CSS動畫?
    通用CSS動畫,用於左右運動 ,我們將探索創建一個通用的CSS動畫,以向左和右移動DIV,從而到達其容器的邊緣。該動畫可以應用於具有絕對定位的任何div,無論其未知長度如何。 問題:使用左直接導致瞬時消失 更加流暢的解決方案:混合轉換和左 [並實現平穩的,線性的運動,我們介紹了線性的轉換。...
    程式設計 發佈於2025-05-09
  • 在PHP中如何高效檢測空數組?
    在PHP中如何高效檢測空數組?
    在PHP 中檢查一個空數組可以通過各種方法在PHP中確定一個空數組。如果需要驗證任何數組元素的存在,則PHP的鬆散鍵入允許對數組本身進行直接評估:一種更嚴格的方法涉及使用count()函數: if(count(count($ playerList)=== 0){ //列表為空。 } 對...
    程式設計 發佈於2025-05-09
  • Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    Java的Map.Entry和SimpleEntry如何簡化鍵值對管理?
    A Comprehensive Collection for Value Pairs: Introducing Java's Map.Entry and SimpleEntryIn Java, when defining a collection where each element com...
    程式設計 發佈於2025-05-09
  • 解決Spring Security 4.1及以上版本CORS問題指南
    解決Spring Security 4.1及以上版本CORS問題指南
    彈簧安全性cors filter:故障排除常見問題 在將Spring Security集成到現有項目中時,您可能會遇到與CORS相關的錯誤,如果像“訪問Control-allo-allow-Origin”之類的標頭,則無法設置在響應中。為了解決此問題,您可以實現自定義過濾器,例如代碼段中的MyFi...
    程式設計 發佈於2025-05-09
  • 將圖片浮動到底部右側並環繞文字的技巧
    將圖片浮動到底部右側並環繞文字的技巧
    在Web設計中圍繞在Web設計中,有時可以將圖像浮動到頁面右下角,從而使文本圍繞它纏繞。這可以在有效地展示圖像的同時創建一個吸引人的視覺效果。 css位置在右下角,使用css float and clear properties: img { 浮點:對; ...
    程式設計 發佈於2025-05-09
  • 如何檢查對像是否具有Python中的特定屬性?
    如何檢查對像是否具有Python中的特定屬性?
    方法來確定對象屬性存在尋求一種方法來驗證對像中特定屬性的存在。考慮以下示例,其中嘗試訪問不確定屬性會引起錯誤: >>> a = someClass() >>> A.property Trackback(最近的最新電話): 文件“ ”,第1行, AttributeError: SomeClass...
    程式設計 發佈於2025-05-09
  • C++20 Consteval函數中模板參數能否依賴於函數參數?
    C++20 Consteval函數中模板參數能否依賴於函數參數?
    [ consteval函數和模板參數依賴於函數參數在C 17中,模板參數不能依賴一個函數參數,因為編譯器仍然需要對非contexexpr futcoriations contim at contexpr function進行評估。 compile time。 C 20引入恆定函數,必須在編譯時進...
    程式設計 發佈於2025-05-09
  • 在Oracle SQL中如何提取下劃線前的子字符串?
    在Oracle SQL中如何提取下劃線前的子字符串?
    [ 在oracle sql 解決方案: Explanation:SUBSTR function extracts a substring starting from the specified position (0) and continuing for a specified length.IN...
    程式設計 發佈於2025-05-09
  • PHP SimpleXML解析帶命名空間冒號的XML方法
    PHP SimpleXML解析帶命名空間冒號的XML方法
    在php 很少,請使用該限制很大,很少有很高。例如:這種技術可確保可以通過遍歷XML樹和使用兒童()方法()方法的XML樹和切換名稱空間來訪問名稱空間內的元素。
    程式設計 發佈於2025-05-09
  • 如何正確使用與PDO參數的查詢一樣?
    如何正確使用與PDO參數的查詢一樣?
    在pdo 中使用類似QUERIES在PDO中的Queries時,您可能會遇到類似疑問中描述的問題:此查詢也可能不會返回結果,即使$ var1和$ var2包含有效的搜索詞。錯誤在於不正確包含%符號。 通過將變量包含在$ params數組中的%符號中,您確保將%字符正確替換到查詢中。沒有此修改,PD...
    程式設計 發佈於2025-05-09
  • 在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-09

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3