Cấu Hình PHP, PHP-FPM Và PHP CLI Chuẩn Production
Rất nhiều người khi setup một server PHP thường nghĩ đơn giản: cài php, cài php-fpm, cài nginx, trỏ server_name, restart service là xong — web chạy được, vậy là "deploy thành công". Nhưng đó chỉ là điều kiện cần, không phải điều kiện đủ.
Một hệ thống chạy PHP thực sự "hoạt động tốt" phải đáp ứng được ba yếu tố cùng lúc: đúng với phần cứng (RAM, CPU, disk I/O của server), đúng với workload (bao nhiêu request/giây, request nặng hay nhẹ, có nhiều upload file lớn hay không, có chạy background job bằng CLI hay không), và quan trọng không kém là phải được theo dõi (monitoring) và điều chỉnh liên tục theo thời gian. Cấu hình mặc định của PHP và PHP-FPM sau khi cài đặt gần như luôn là cấu hình "an toàn cho mọi máy", tức là không tối ưu cho bất kỳ máy nào cụ thể.
Bài viết này sẽ đi sâu vào các nhóm setting quan trọng nhất của PHP, PHP-FPM và PHP CLI, giải thích cơ chế hoạt động bên dưới, và hướng dẫn cách tính toán con số phù hợp với server thật của bạn thay vì copy-paste một file config mẫu trên mạng.
Nội dung chính:
- PHP hoạt động khác nhau thế nào giữa CLI, FPM và module Apache
- Cách kiểm tra cấu hình thực tế với
phpinfo()vàphp -i - Nhóm setting về memory và upload file
- PHP-FPM Process Manager: static, dynamic, ondemand
- Công thức tính
pm.max_childrentheo RAM thật - PHP CLI vs PHP-FPM: vì sao cùng một
php.ininhưng hành xử khác nhau - OPcache và ảnh hưởng đến performance
- Theo dõi hệ thống: FPM status page, slow log, log phân tích
- Bảng cấu hình mẫu theo từng loại server
- Các lỗi thường gặp và cách chẩn đoán
PHP Hoạt Động Khác Nhau Thế Nào Giữa CLI, FPM Và Module
Trước khi chỉnh bất kỳ setting nào, cần hiểu PHP không chỉ chạy một cách. Có ba "SAPI" (Server API) phổ biến:
- PHP CLI (
php): chạy trực tiếp trong terminal, dùng cho script, cron job, queue worker, Artisan command... Mỗi lần chạy là một process độc lập, khởi động rồi thoát. - PHP-FPM (FastCGI Process Manager): chạy như một service thường trực (daemon), giữ sẵn một pool các process con (worker) để xử lý request HTTP đến từ Nginx/Apache qua giao thức FastCGI.
- Module (mod_php): PHP nhúng trực tiếp vào Apache worker, ngày nay ít dùng cho production vì kém linh hoạt hơn FPM.
Điểm mấu chốt: CLI và FPM đọc hai file cấu hình khác nhau, dù cùng là PHP. Mỗi SAPI có thư mục ini riêng:
php --ini
# Loaded Configuration File: /etc/php/8.3/cli/php.ini
# Scan for additional .ini files in: /etc/php/8.3/cli/conf.d
php-fpm8.3 -i | grep "Loaded Configuration File"
# Loaded Configuration File: /etc/php/8.3/fpm/php.ini
Đây là lý do rất nhiều người "tăng memory_limit rồi mà vẫn lỗi" — họ sửa nhầm file cli/php.ini trong khi web chạy qua fpm/php.ini, hoặc ngược lại.
Kiểm Tra Cấu Hình Thực Tế Với phpinfo() Và php -i
Đừng bao giờ giả định file .ini bạn sửa là file đang thực sự được load. Có ba cách xác minh:
<?php
// info.php — CHỈ dùng tạm khi debug, xoá ngay sau khi dùng xong
phpinfo();
phpinfo() khi truy cập qua trình duyệt sẽ cho biết chính xác SAPI đang chạy (Server API => FPM/FastCGI), đường dẫn php.ini đã load, danh sách file trong conf.d được include, và giá trị hiệu lực (Local Value) so với giá trị mặc định (Master Value) của từng directive.
# Xem toàn bộ thông tin build + config qua CLI
php -i | less
# Xem nhanh một setting cụ thể
php -i | grep -i "memory_limit"
# Kiểm tra pool FPM đang chạy dùng config nào
php-fpm8.3 -tt
Cảnh báo bảo mật: file
info.phpđể lộ đường dẫn hệ thống, phiên bản PHP, biến môi trường... Chỉ đặt tạm thời trên môi trường không public, và xoá ngay sau khi kiểm tra xong.
Yêu cầu đăng nhập
Vui lòng đăng nhập để truy cập nội dung này
Additional Resources
Course Guide
Comprehensive PDF guide with examples
GitHub Repository
Example code for all lessons
Discussion
Have a question about this lesson? Post it here and get answers from instructors and peers.
