Website được thiết kế tối ưu cho thành viên chính thức. Hãy Đăng nhập hoặc Đăng ký để truy cập đầy đủ nội dung và chức năng. Nội dung bạn cần không thấy trên website, có thể do bạn chưa đăng nhập. Nếu là thành viên của website, bạn cũng có thể yêu cầu trong nhóm Zalo "CNTT" các nội dung bạn quan tâm.

29. Tối ưu PHP cho website production

ICT

1. Vì sao PHP thường là điểm nghẽn hiệu năng?

Trong rất nhiều hệ thống web, khi website chậm hoặc timeout, phản xạ đầu tiên thường là:

  • “Nginx yếu”

  • “Server thiếu CPU”

  • “Cần nâng cấp máy”

Trong thực tế, rất nhiều vấn đề xuất phát từ:

PHP-FPM chưa được cấu hình phù hợp với tải thực tế.

PHP là lớp:

  • Xử lý logic

  • Kết nối database

  • Thực hiện nhiều thao tác tốn tài nguyên

Nếu không tối ưu:

  • PHP nghẽn → Nginx trả 502

  • Website chậm dù CPU còn trống

  • RAM bị sử dụng không hiệu quả


2. Nguyên tắc tối ưu PHP cho production

Trong loạt bài này, tối ưu PHP tuân theo:

  1. Hiểu tải thực tế trước khi chỉnh

  2. Không copy cấu hình “tối ưu cao cấp” trên mạng

  3. Ưu tiên ổn định hơn tốc độ cực đại

  4. Có thể rollback nhanh

  5. Mỗi thay đổi đều có lý do

Nguyên tắc:

PHP tối ưu tốt là PHP không gây bất ngờ khi tải tăng.


3. Tối ưu PHP-FPM pool (trọng tâm)

3.1. File cấu hình pool PHP-FPM

Ví dụ với PHP 8.3:

/etc/php/8.3/fpm/pool.d/www.conf

Không chỉnh trực tiếp khi chưa backup:

sudo cp www.conf www.conf.bak

3.2. Chế độ quản lý process (pm)

Khuyến nghị cho production phổ thông:

pm = dynamic

Lý do:

  • Tự điều chỉnh theo tải

  • Ít rủi ro nghẽn đột ngột


3.3. Các tham số quan trọng nhất

Ví dụ cấu hình khởi điểm an toàn:

pm.max_children = 20
pm.start_servers = 4
pm.min_spare_servers = 2
pm.max_spare_servers = 6 

Giải thích:

  • pm.max_children: số PHP process tối đa

  • Các giá trị khác giúp PHP phản ứng linh hoạt khi tải tăng

Không nên:

Đặt pm.max_children quá cao khi chưa tính RAM.


4. Cách ước lượng pm.max_children (đúng cách)

4.1. Vì sao không đoán?

Mỗi PHP process:

  • Tốn RAM

  • Tùy thuộc CMS, plugin, framework

Đặt sai:

  • Quá thấp → nghẽn

  • Quá cao → OOM, sập server


4.2. Cách ước lượng đơn giản

  1. Quan sát RAM mỗi PHP process:

     
    ps --no-headers -o "rss,cmd" -C php-fpm8.3 | awk '{sum+=$1} END {print sum/NR}'
  2. Ví dụ:

    • Trung bình ~50MB / process

  3. Nếu dành ~1GB RAM cho PHP:

     
    1024 / 5020 process

→ pm.max_children = 20 là hợp lý.


5. Tối ưu timeout và request handling

5.1. request_terminate_timeout

Ngăn PHP chạy mãi khi có lỗi:

 
request_terminate_timeout = 60s

Giúp:

  • Tránh process treo

  • Giải phóng tài nguyên


5.2. max_execution_time (php.ini)

Trong php.ini (FPM):

 
max_execution_time = 60 

Không nên:

Đặt quá cao để “cho chắc”.


6. Bật và tối ưu OPcache (bắt buộc cho production)

6.1. Vì sao OPcache rất quan trọng?

OPcache:

  • Cache opcode PHP

  • Giảm compile mỗi request

  • Tăng tốc đáng kể

Trong production:

Không bật OPcache là lãng phí tài nguyên.


6.2. Cấu hình OPcache cơ bản

Trong php.ini:

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=60 

Giải thích:

  • Phù hợp đa số website

  • An toàn cho production


7. Tách pool cho website quan trọng (khi cần)

Với website lớn:

  • Có thể tạo pool riêng

  • Cô lập lỗi và tài nguyên

Ví dụ:

 
/etc/php/8.3/fpm/pool.d/site1.conf

Lợi ích:

  • Một site lỗi không ảnh hưởng site khác

  • Dễ điều chỉnh tài nguyên riêng


8. Restart PHP-FPM đúng cách

Sau khi chỉnh cấu hình:

 
sudo systemctl reload php8.3-fpm

Reload:

  • Không ngắt toàn bộ kết nối

  • Áp dụng cấu hình mới


9. Theo dõi PHP sau khi tối ưu

Cần theo dõi:

  • CPU

  • RAM

  • Log PHP-FPM

File log:

/var/log/php8.3-fpm.log 

Không thấy lỗi:

Cấu hình đang ổn định.


10. Những sai lầm phổ biến khi tối ưu PHP

  • Copy cấu hình “siêu tối ưu”

  • Đặt pm.max_children quá cao

  • Không bật OPcache

  • Không theo dõi sau khi chỉnh

  • Restart server để “chữa cháy”

Những sai lầm này:

Tạo ra hệ thống khó đoán và dễ sập khi tải tăng.


11. Checklist tối ưu PHP cho production

  •  pm.max_children tính toán có cơ sở

  •  OPcache bật và cấu hình đúng

  •  Timeout hợp lý

  •  Có thể reload không downtime

  •  Theo dõi sau khi tối ưu


12. Bài tiếp theo

Trong Bài 30, chúng ta sẽ chuyển sang lớp dữ liệu:

Tổng quan Database (MySQL/MariaDB) trong Web Server

Bài này sẽ giúp:

  • Hiểu vai trò DB

  • Chuẩn bị cho cài đặt và tối ưu DB đúng cách