PHP Doesn't Really Die After Every Request: OPcache, PHP-FPM and Worker Mode in Production
Câu "PHP chết sau mỗi request" được lặp lại nhiều đến mức nhiều dev tin rằng mỗi request đều khởi động lại toàn bộ PHP. Thực tế không phải vậy. Thứ bị dọn sau mỗi request là request state: biến, object, static property. Process PHP-FPM vẫn sống, và OPcache vẫn giữ bytecode trong shared memory. Hiểu đúng ranh giới này giúp bạn tune server có cơ sở, đọc đúng số liệu, và tránh một loại bug rất nguy hiểm khi chuyển sang worker mode. Bài này đi qua những gì thực sự xảy ra bên trong Zend Engine, kèm các lệnh và config dùng được ngay với PHP 8.4 trở lên. Điều gì sống, điều gì chết sau một request? PHP có hai vòng đời lồng nhau. Vòng ngoài là của process: module startup (MINIT) chạy khi process khởi động, module shutdown (MSHUTDOWN) chạy khi process tắt. Vòng trong là của request: RINIT ở đầu request, RSHUTDOWN ở cuối request. Với PHP-FPM, vòng trong lặp lại nhiều lần trong khi vòng ngoài chỉ chạy một lần cho mỗi worker. Nếu không có OPcache, mỗi request phải đi qua cả pipeline: đọc file, lexing, parsing ra AST, compile thành opcode, rồi Zend VM mới thực thi. Với một app Laravel hoặc Symfony load hàng trăm file, phần compile này bị lặp lại vô ích. OPcache lưu opcode vào shared memory để các worker dùng chung, nên request sau bỏ qua được gần hết pipeline. flowchart TD A[Request den PHP-FPM worker] --> B[RINIT: khoi tao request state] B --> C{Opcode co trong OPcache?} C -- Co --> F[Zend VM thuc thi opcode] C -- Khong --> D[Lexer, Parser, AST] D --> E[Compile va luu vao OPcache] E --> F F --> G[RSHUTDOWN: don request state] G --> H[Worker cho request tiep theo] Điểm cần nhớ: OPcache chỉ bỏ qua bước compile. Code bootstrap vẫn chạy lại mỗi request, gồm đăng ký service provider, load config, resolve container. Đây là lý do một app framework lớn đã bật OPcache vẫn có thể mất vài chục millisecond trước khi chạm vào business logic. Tune OPcache và PHP-FPM dựa trên số thật Config production mình thường bắt đầu với: ; /etc/php/8.4/fpm/conf.d/10-opcache.ini opcache.enable=1 opcache.memory_consumption=256 opcache.interned_strings_buffer=32 opcache.max_accelerated_files=20000 ; Không stat file mỗi request, nhưng BẮT BUỘC reload khi deploy opcache.validate_timestamps=0 Đây chỉ là điểm xuất phát. Sau khi app chạy một thời gian, hãy kiểm tra số liệu thật. Lưu ý là CLI và FPM dùng hai vùng OPcache riêng, nên chạy php -r trên terminal sẽ không cho biết gì về FPM. Hãy dùng cachetool kết nối trực tiếp vào FPM socket, hoặc tạo một endpoint nội bộ có bảo vệ:
This is a summary aggregated from Dev.to. Read the complete article on the original site:
Read full article at Dev.to