# Hiệu năng PHP

> Cách ZoPanel chứa hàng trăm website PHP trên một server: PHP rảnh tự ngủ, PHP luôn chạy, OPcache lưu trên đĩa, nén bộ nhớ và cắt tải khi quá tải.

Source: https://zopanel.net/vi/docs/php-performance  
Updated: 2026-10-07

Trên server hosting chung, phần lớn website hầu như không có truy cập trong phần lớn thời gian. ZoPanel tận dụng điều đó: PHP của website rảnh sẽ ngủ, mã đã biên dịch được giữ trên đĩa để thức dậy nhanh, bộ nhớ rảnh được nén ngay trong RAM, và server quá tải sẽ bỏ bớt những việc không còn phục vụ kịp. Trang này giải thích từng cơ chế và các thiết lập điều khiển chúng.

Trên server thử nghiệm, nhờ các cơ chế này một VPS Ubuntu 24.04 có 4 GB RAM và 4 vCPU chạy được 100 website WordPress không page cache, hoặc 250 website có page cache, mỗi trường hợp kèm 30 ứng dụng. Một server Debian 12 có 3 GB RAM chạy được 50 và 200. Sau khi bị quá tải nặng, các server trở lại bình thường trong 2 đến 5 phút kể từ khi tải dừng.

## PHP rảnh tự ngủ

Mỗi tài khoản hosting có pool PHP-FPM riêng cho từng phiên bản PHP. Ngay cả khi không có ai truy cập, tiến trình master của một pool vẫn tốn khoảng 25 MB, nên hàng trăm tài khoản ít truy cập sẽ lãng phí hàng GB RAM.

ZoPanel dừng pool khi nó không có việc gì trong suốt thời gian rảnh đã đặt. Socket của pool vẫn mở, nên request tiếp theo khởi động lại PHP trong vài trăm mili giây. Khách truy cập không gặp lỗi, chỉ trang đầu tiên chậm hơn một chút.

### Đặt thời gian rảnh

1. Vào **Cài đặt → Hệ thống**.
2. Ở thẻ **Hiệu năng PHP**, chọn **Dừng PHP rảnh sau**: 5, 15 hoặc 30 phút, 1 hoặc 3 giờ, hoặc **Không bao giờ (luôn chạy)**.

**30 phút** là mức khuyên dùng và là mặc định: đủ dài để website có truy cập vài phút một lần luôn sẵn sàng. Thời gian ngắn hơn giúp tiết kiệm RAM trên server đông tài khoản; **Không bao giờ** giữ PHP của mọi website luôn chạy.

Thẻ này còn hiển thị số pool đang chạy (và số pool luôn chạy), **RAM PHP đang dùng** và dung lượng **Bộ đệm mã biên dịch**.

Một vài chi tiết:

- Request từ giám sát uptime không được tính là lượt truy cập, nên riêng việc giám sát không giữ website rảnh luôn thức.
- Khi thiếu RAM, các pool rảnh bị dừng sớm hơn, pool rảnh lâu nhất dừng trước, không cần chờ hết thời gian rảnh. Pool đang xử lý request không bao giờ bị dừng vì lý do này.

## PHP luôn chạy

Với các gói cao cấp, bật **PHP luôn chạy** trong gói hosting (**Gói hosting → Sửa gói**). Pool của các tài khoản này được khởi động cùng hệ thống và không bao giờ bị dừng vì rảnh, nên không khách nào gặp lần khởi động chậm. Mỗi website luôn chạy giữ RAM của pool (khoảng 20-60 MB) kể cả khi không có ai truy cập. Xem [Gói hosting và giới hạn](/vi/docs/packages-limits).

## OPcache lưu trên đĩa

OPcache giữ mã PHP đã biên dịch trong bộ nhớ, và phần này mất đi khi pool dừng. ZoPanel lưu thêm mã đã biên dịch của từng tài khoản trên đĩa, tại `/var/cache/zopanel/opcache/TÊN-TÀI-KHOẢN`. Khi pool đang ngủ chạy lại, nó nạp mã đã biên dịch từ đây thay vì biên dịch lại mọi script, nên request đầu tiên gần nhanh như khi pool đang chạy sẵn.

Thư mục cache của mỗi tài khoản là riêng tư (quyền 0700), nên không tài khoản nào đọc được hay cài mã biên dịch vào tài khoản khác. Script không được nạp trong 30 ngày và thư mục của tài khoản đã xoá được dọn mỗi ngày.

Nếu trang **Tối ưu** báo OPcache đang tắt cho một phiên bản PHP, hãy cài gói OPcache của phiên bản đó như gợi ý.

## Phân bổ RAM cho khách

ZoPanel chia RAM giữa hệ thống và khách:

- **Hệ thống** (database, mail, nginx, panel và kernel) giữ một phần dự trữ, tính theo cấu hình máy và mức dùng cao nhất thực tế trong ngày qua, và không bao giờ quá một nửa RAM.
- **Khách** (toàn bộ pool PHP, ứng dụng, shell và app Docker cộng lại) được dùng phần còn lại, dưới dạng giới hạn cứng.

Mức phân bổ được tính lại mỗi 10 phút. Thẻ **Hiệu năng PHP** hiển thị nó: website và ứng dụng của toàn bộ khách dùng tối đa X; hệ thống giữ Y.

Khi một đợt truy cập dồn dập đánh thức hàng trăm website cùng lúc, kernel hãm tốc hoặc dừng tiến trình của khách, ưu tiên một PHP worker vốn được khởi động lại ngay, trong khi SSH, panel, nginx và database vẫn hoạt động.

## Nén bộ nhớ (zswap)

Trên **Linux 6.8 trở lên**, ZoPanel nén bộ nhớ rảnh của khách (master PHP đang ngủ, OPcache, ứng dụng rảnh) ngay trong RAM bằng zswap, dùng zstd (hoặc lz4 nếu không có). Trang bộ nhớ đã nén **không bao giờ bị ghi ra đĩa**: phần không nén vừa thì vẫn nằm trong RAM. Nhờ đó cùng một lượng RAM chứa được nhiều website hơn, mà không có cảnh swap ra đĩa khiến server quá tải khó hồi phục.

Tính năng tự bật khi:

1. Kernel từ 6.8 trở lên: Ubuntu 24.04 và Debian 13 có sẵn, Ubuntu 22.04 với kernel HWE do bộ cài thêm vào, Debian 12 với kernel backports.
2. Server có thiết bị swap. Bộ cài tạo swap cho server dưới 4 GB RAM. Nếu chưa có, trang **Tối ưu** gợi ý tạo file swap kèm nút áp dụng một chạm.

### Kiểm tra trên trang Tối ưu

Vào **Tối ưu** (trong nhóm **Máy chủ** của menu):

- **Đang nén bộ nhớ** kèm tỉ lệ nén hiện tại.
- **Kernel X chưa nén bộ nhớ khách an toàn được** nghĩa là kernel cũ hơn 6.8. Gợi ý kèm sẵn lệnh cài kernel mới hơn. Trên Ubuntu 22.04:

  ```bash
  apt install --install-recommends linux-generic-hwe-22.04 && reboot
  ```

  Trên Debian 12 (kernel backports, nằm ngoài diện hỗ trợ bảo mật của Debian):

  ```bash
  echo 'deb http://deb.debian.org/debian bookworm-backports main' > /etc/apt/sources.list.d/backports.list && apt update && apt install -t bookworm-backports linux-image-amd64 && reboot
  ```

  Trên server ARM64, gói Debian tương ứng là `linux-image-arm64`.

Hãy khởi động lại vào giờ ít truy cập: website ngừng hoạt động trong lúc khởi động lại.

## Cắt tải khi quá tải

Khi server quá tải nặng, request dồn vào socket PHP nhanh hơn tốc độ PHP xử lý. Phần lớn khách đã bỏ đi từ lâu, nhưng PHP vẫn sẽ chạy từng request, giữ hàng trăm pool thức và khiến server thiếu RAM rất lâu sau khi tải đã hết.

ZoPanel bỏ bớt phần việc đó, nhưng chỉ khi đồng thời:

- RAM của khách đã thiếu nghiêm trọng ít nhất một phút (gần chạm giới hạn của khách, hoặc tiến trình phải chờ bộ nhớ 70% thời gian);
- hàng đợi của một pool đã đầy ít nhất 30 giây.

Các request đang chờ của pool đó bị bỏ, tối đa một lần mỗi phút cho mỗi pool. Khách vẫn đang chờ sẽ thấy ngay trang "This website is very busy right now" (website đang quá tải) tự tải lại. Nhờ vậy các pool rảnh trở lại và giải phóng RAM. Server chạy bình thường không bao giờ chạm tới ngưỡng này.

## Lời khuyên

- Bật **Page cache** (website → tab **PHP & cấu hình**) cho website WordPress: đây là cải thiện lớn nhất. Trang **Tối ưu** liệt kê các website WordPress chưa bật và có thể bật giúp bạn.
- Giữ thời gian rảnh 30 phút trừ khi server thiếu RAM.
- Chỉ dùng **PHP luôn chạy** cho những gói thực sự cần.
- Theo dõi trang **Tối ưu** để biết khi PHP-FPM có thể dùng hết RAM, khi thiếu swap hoặc kernel đã cũ.
