提升效能:優化 PHP 腳本的最佳實務

優化 PHP 腳本對於建立快速且有效率的 Web 應用程式至關重要。沒有人喜歡緩慢的網站,而使用者的耐性比以往任何時候都要差,因此提升效能應該是任何開發人員的首要任務。今天,我們將探討一些久經考驗的方法,幫助您為 PHP 程式腳本充電,以確保應用程式能流暢且有效率地執行。

目標受眾:本文針對初級到中級的使用者 PHP 開發人員 他們希望透過應用實用的最佳化技術來改善網路應用程式的效能。

1.用心儲存

改善 PHP 效能最有效的方法之一就是快取。這個想法很簡單:不要重複執行相同的腳本,而是將結果儲存起來,並在需要時提供。工具如 OPcache 甚至 Memcached 可以透過儲存已編譯的腳本文字碼來大幅減少執行時間,這表示 PHP 在每次呼叫時都不需要重新編譯您的程式碼。有效地執行快取可大幅提升效能,尤其是對於內容繁重的網站。

真實情境:想像一下運行一個高流量的電子商務網站。每個使用者請求可能需要多次資料庫呼叫,以顯示產品資訊、使用者詳細資訊和建議。使用 OPcache 儲存已編譯的 bytecode,並使用 Memcached 快取資料庫結果,您可以大幅縮短回應時間,確保客戶不會因為頁面載入緩慢而放棄購物車。
初學者範例:假設您有一個產品列表頁面,每次使用者造訪時都會從資料庫中取得產品詳細資訊。將這些產品詳細資料快取幾分鐘,就可以減少資料庫的點擊次數,進而加快頁面的載入時間,並減少伺服器的負擔。

逐步設定 OPcache:

  1. 確保已安裝 OPcache: sudo apt-get install php-opcache
  2. 在您的 php.ini file:
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000

3.重新啟動您的 Web 伺服器: sudo service apache2 restart

2.優化資料庫查詢

在大多數 PHP 應用程式中,資料庫是效能瓶頸。確保您沒有進行不必要的資料庫呼叫 - 只擷取您需要的資料,並利用索引欄位加速搜尋作業。考慮連接資料表或使用準備好的語句,而不是在多次資料庫呼叫中進行循環。一個優化的查詢可以抵得上一百多行的 PHP 程式碼。

代碼範例:

// 使用 JOIN 來最佳化取得包含註解的部落格文章
$query = "SELECT posts.*, comments.* FROM posts LEFT JOIN comments ON posts.id = comments.post_id WHERE posts.id = ?";
$stmt = $db->prepare($query);
$stmt->execute([$postId]);
$results = $stmt->fetchAll();

真實情境:想像一下運行一個高流量的電子商務網站。每個使用者請求可能需要多次資料庫呼叫,以顯示產品資訊、使用者詳細資訊和建議。使用 OPcache 儲存已編譯的 bytecode,並使用 Memcached 快取資料庫結果,您可以大幅縮短回應時間,確保客戶不會因為頁面載入緩慢而放棄購物車。
初學者範例:假設您有一個產品列表頁面,每次使用者造訪時都會從資料庫中取得產品詳細資訊。將這些產品詳細資料快取幾分鐘,就可以減少資料庫的點擊次數,進而加快頁面的載入時間,並減少伺服器的負擔。

3.明智使用內建功能

PHP 內建了許多針對效能最佳化的函式。在可能的情況下,請使用這些函式,而不要自己寫函式。例如,像 in_array()array_search() 是高效率的,並針對其目的進行了最佳化。如果有適合您需求的內建功能,總是比客製解決方案更可取。

程式碼範例

// 不需要撰寫自訂函式來搜尋陣列中的值
function customSearch($needle, $haystack) {
foreach ($haystack as $value) {
if ($value === $needle) {
返回 true;
}
}
return false;
}

// 使用內建函式
$found = in_array($needle, $haystack); // 這會更快更有效率

4. 避免循環過載

巢狀循環會拖累效能。請務必盡量減少迴圈巢狀或找出減少迭代的方法。不要使用多個 循環,考慮陣列函數,例如 array_map(), array_filter()遍歷 邏輯性的中斷,以保持作業效率。

代碼範例:

// 使用 array_map 對每個元素套用函數
$numbers = [1, 2, 3, 4, 5];
$squaredNumbers = array_map(function($number) {
return $number * $number;
}, $numbers);

5. 設定您的程式碼

如果不知道瓶頸在哪裡,如何進行最佳化?工具如 Xdebug黑火 可協助您瞭解程式碼中哪些部分佔用了最多的時間。剖析工具可讓您清楚瞭解函式的執行時間、記憶體使用量以及其他效能指標。知道是什麼在拖慢您的速度,您就可以更有效地針對目標進行最佳化。

真實情境:假設您有一個 API 端點需要花很長的時間來回應。透過剖析程式碼,您發現涉及多重巢狀循環的特定函式消耗了大部分時間。您可以透過優化此函數或以更有效率的演算法取代它,大幅縮短回應時間。

適合初學者的 Xdebug 設定:

安裝 Xdebug: pecl install xdebug

啟用 Xdebug 在您的 php.ini file:

zend_extension="xdebug.so" 

xdebug.profiler_enable = 1

重新啟動伺服器,並使用下列工具分析產生的 cachegrind 檔案 KCacheGrind.

程式碼範例 (使用 Xdebug):

// 若要使用 Xdebug 剖析您的指令碼,請在 php.ini 中啟用 Xdebug 剖析功能
xdebug.profiler_enable = 1;
// 使用 KCacheGrind 等工具分析產生的 cachegrind 檔案。

6.明智使用自動彈射器

使用 自動加藥機 有助於保持程式碼的乾淨,但過度使用可能會大幅增加開銷。確保您只載入所需的內容,並將不必要的類別置於記憶體之外。考慮使用 作曲家 內建自動加載最佳化功能,只載入所需的課程。

真實情境:在具有許多不同模組的大型 Web 應用程式中,使用全局自動加載器可能會導致顯著的開銷。例如,如果每次請求都載入所有的類別,就會不必要地增加記憶體使用量。取而代之,配置 Composer 的自動加載功能,使其只加載所需的內容,這樣可以大幅減少加載時間和記憶體消耗。

初學者範例:使用 Composer 設定自動加載時,請使用:

{
"autoload":{
"PSR-4":{
"App\":"src/"
}
}
}

編輯後 composer.json運行 composer dump-autoload --optimize 以確保只載入必要的檔案。

7. 利用輸出緩衝

輸出緩衝是一個較少為人知的 PHP 性能優化技巧。與其直接逐行將資料傳送至用戶端,不如啟用輸出緩衝來收集所有輸出並將其一次性傳送。這樣可以減少來回傳送的次數,從而改善載入時間。

實際情況:對於提供動態內容的高流量部落格網站,啟用輸出緩衝功能可大幅縮短載入時間。透過收集所有內容並一次傳送,伺服器可將與用戶端的互動減至最少,尤其是在產生大型 HTML 頁面時。

程式碼範例:

// 啟用輸出緩衝
ob_start();
echo "This is some content.";
echo 「 更多內容。」;
// 一次傳送所有輸出
echo ob_get_clean();

初學者範例:對於簡單的表單提交,使用輸出緩衝來收集輸出並一次傳送,而不是逐行迴應每個回應。這可減少伺服器與用戶端的互動時間。

8. 最小化檔案 I/O

存取檔案可能會耗費大量效能,尤其是在處理大型資料集時。在可能的情況下,盡量減少檔案讀取和寫入。將常存取的檔案保留在記憶體中,或使用快取機制來避免多餘的 I/O 作業。此外,如果您包含多個 PHP 檔案,請盡可能將它們合併,以減少 包括規定 報表。

真實情境:在需要產生大型 CSV 檔案的報表系統中,可先在記憶體中收集所有資料,然後再一次全部寫入,以盡量減少檔案寫入的次數。這樣可以節省大量的 I/O 時間,並改善腳本效能。

初學者範例:如果您的腳本重複從檔案讀取組態設定,請考慮讀取一次檔案,並將資料儲存在陣列中。這樣,您就可以避免多次開啟和讀取檔案的開銷。

9. 在生產中關閉調試

確保在生產環境中關閉錯誤回報和除錯工具。它們不僅會造成安全風險,還會因為產生不必要的記錄和輸出而減慢應用程式的速度。

10. 使用內容傳遞網路 (CDN)

雖然這與您的 PHP 程式碼沒有直接關係,但使用 CDN 可透過卸載靜態資產和降低伺服器負載,大幅改善您的網頁應用程式效能。這可讓您的伺服器專注於執行 PHP 指令碼,帶來更快速、反應更迅速的體驗。

總結

效能最佳化不只是要寫出能運作的程式碼,而是要寫出能有效運作的程式碼。透過遵循這些最佳實務 - 快取結果、最佳化資料庫互動、利用內建函式,以及剖析您的腳本 - 您可以確保您的 PHP 應用程式保持敏捷,並提供一流的使用者體驗。請記住,對您和您的使用者來說,一個更快的網站就是一個更快樂的網站。

您嘗試過這些技術嗎?或者您有最喜歡的優化 PHP 腳本的方法嗎?請在下方留言並分享您的見解!

相關文章

回應

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *