PDO persistent connection: khi nào dùng, khi nào nên tránh và làm sao không để session MySQL bị “rò” giữa request?

Đang tìm đáp án

26 lượt xem · 3 trả lời

Cộng đồng đang cùng tìm lời giải

Người đặt câu hỏi có thể chọn câu trả lời hữu ích nhất làm đáp án.

1. 19:10 12/08/2026
Chào admin, Mình thấy PDO có tùy chọn persistent connection. Một số bài viết nói nó giúp giảm chi phí kết nối MySQL, nhưng cũng có cảnh báo về transaction/session state còn sót giữa các request PHP-FPM. Hệ thống của mình có nhiều request ngắn và đôi lúc dùng SET time_zone hoặc temporary table. Nên đánh giá và cấu hình connection management thế nào cho an toàn?
0 Facebook
2. 19:10 12/08/2026
Chào bạn Quỳnh Như, Persistent connection có thể giảm chi phí mở kết nối trong một số mô hình PHP-FPM, nhưng nó biến connection thành tài nguyên được tái sử dụng nên mọi session state phải được quản lý nghiêm ngặt. Đừng bật chỉ vì nghe nói nhanh hơn; trước hết hãy đo connection churn, DB CPU, max_connections, latency và cách hạ tầng của bạn đang pool/tái sử dụng kết nối. Nếu cân nhắc dùng: 1. Mỗi request phải kết thúc transaction rõ ràng: commit hoặc rollback. Không để transaction mở và trông chờ request kế tiếp xử lý. 2. Tránh dựa vào trạng thái connection bí mật như temp table, user variable, SQL mode, time zone hoặc session setting mà không khởi tạo lại theo một chuẩn nhất quán khi checkout connection. 3. Đặt charset, error mode, timezone và các setting cần thiết ngay trong quá trình tạo/khởi tạo connection, đồng thời kiểm thử request xen kẽ giữa nhiều user/tenant. 4. Kiểm soát max_connections và số FPM worker; nhiều process có persistent connection vẫn có thể làm database cạn connection. 5. Theo dõi abandoned transaction, connection age, wait timeout, lỗi too many connections và slow query. Với nhiều ứng dụng PHP thông thường, connection không persistent cùng PDO cấu hình tốt đã đủ đơn giản và an toàn. Quyết định chỉ nên được đưa ra sau benchmark và review các session state mà ứng dụng có thể tạo.
0
3. 19:08 06/10/2026
Trả lời Quỳnh Như Chào admin, Mình thấy PDO có tùy chọn persistent connection. Một số bài viết nói nó giúp giảm chi phí kết nối MySQL, như…
Kết nối PDO persistent có thể hữu ích khi bạn xử lý nhiều truy vấn trong một quy trình dài (ví dụ: trong CLI hoặc khi xử lý hàng loạt), vì nó giúp giảm chi phí thiết lập kết nối. Tuy nhiên, với các yêu cầu PHP-FPM ngắn, mỗi yêu cầu thường nên bắt đầu với một kết nối sạch: `SET time_zone` hoặc `CREATE TEMPORARY TABLE` có thể còn sót lại và ảnh hưởng đến yêu cầu tiếp theo, gây ra hiện tượng “rò rỉ” phiên làm việc. Hãy cân nhắc sử dụng kết nối thông thường cho hầu hết các yêu cầu, chỉ sử dụng persistent connection khi bạn thực sự cần kết nối sẵn sàng (ví dụ: trong một worker xử lý nhiều tác vụ). Nếu bạn vẫn muốn sử dụng persistent connection, hãy đảm bảo dọn dẹp trạng thái ở đầu mỗi yêu cầu (
0
4. 22:44 13/10/2026
Trả lời Quỳnh Như Chào admin, Mình thấy PDO có tùy chọn persistent connection. Một số bài viết nói nó giúp giảm chi phí kết nối MySQL, như…
Persistent connection (PDO::ATTR_PERSISTENT => true) chỉ מועיל khi overhead kết nối (handshake, auth, SSL) chiếm tỷ trọng lớn so với thời gian query — thường thấy ở hệ thống legacy dùng `mysql_pconnect` hoặc chạy trên network latency cao. Với PHP-FPM hiện đại kết nối localhost/unix socket, chi phí `mysqli_connect`/`PDO` chỉ vài trăm microsecond, nên bật persistent thường **hại hơn lợi**: worker reuse connection mang theo `time_zone`, `sql_mode`, temporary table, user variable, prepared statement cache, thậm chí transaction chưa commit từ request trước. Cách an toàn nhất: **tắt persistent**, dùng connection pool ở lớp trên (ProxySQL, PgBouncer cho Postgres) hoặc để FPM quản lý vòng đời request — mỗi request `new PDO()` rồi tự đóng khi script kết thúc. Nếu buộc phải dùng persistent do giới hạn `max_connections` MySQL, bắt buộc chạy `PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='+00:00'; SET SESSION sql_mode='...'"` và **luôn** `ROLLBACK`/`COMMIT` tường minh, xóa temp table trong `register_shutdown_function` hoặc middleware cuối request. Hệ thống bạn có dùng ProxySQL hay connection pooler nào ở tầng infrastructure chưa?
0
Vui lòng đăng nhập để tham gia trả lời chủ đề này.
Điều hướng nhanh

Bạn muốn khám phá điều gì?

Tìm chủ đề, bài viết hoặc đi thẳng đến một khu vực của cộng đồng.

Esc để đóng Ctrl K để mở lại