Kết nới với CSDL hơn 1 lần có phải là xấu?

Chào anh chị , em newbie là hiện đang dùng PHP và đang học tập về MYSQL . Em có thắc mắc 1 chút về xử lý người dùng , cụ thể khi người dùng đăng nhập sẽ lưu vào session , vấn đề là khi tài khoản của user bị xóa thì session vẫn còn lưu lại . Và em có tìm kiếm trên stack họ cho rằng nên check từ database trên mọi page , cụ thể :

select 1 from "user" WHERE user_id = $_SESSION["user_id"];

Do có hơn 30 model hoặc có thề sau nay là 100 model , ko lẽ cứ mỗi model em lại truy vấn lại câu query này . Do đó em nghĩ nên tạo hẳn 1 kết nối mới đặt đầu index.php để check => có 2 connect đến mysql => điều này có phải là xấu ? Em xin cảm ơn mọi người đã đọc

Vấn đề dùng connection cũ hay là tạo mới connection mỗi lần sử dụng, tui nghĩ là connection pool có phần nào đó giải quyết được thắc mắc của bạn về best practice.

4 Likes

Khi cậu xóa user, sao cậu không hủy luôn session của người dùng đó? :smile:
Khi đó, cậu không phải cân nhắc tới việc phải check người dùng đó đã bị xóa hay chưa nữa.

Việc check DB trên mọi page, hẳn nhiên cậu sẽ tăng chút tải cho database (một chút thôi, câu query đó cũng tương đối nhẹ nhàng). Cơ mà, việc có 1 DB connection chuyên dùng cho từng session là khá tốn kém. Cậu có thể sử dụng connection pool như @Le_Trong1 có đề cập ở trên, tuy nhiên, sẽ tốt nhất khi cậu chỉ đơn giản hủy session của người dùng đó khi cậu đã xóa user đó khỏi DB. Việc này sẽ tránh cho cậu khỏi rất nhiều corner case khác.

Hope it helps!

4 Likes

https://www.php.net/manual/en/function.session-destroy.php
Bao gồm code mẫu.

3 Likes

ua chỉ là khi login thì lưu session sau khi thành công, thì phần lưu session xử lí ở file login rồi, ở index bạn gọi session_start(); rồi check isset session thì duy trì đăng nhập thôi mà, khi close trình duyệt hoặc session expired thì sẽ phải đăng nhập lại chứ check làm gì query kia liên tục cho mệt hixxii

2 Likes

Còn tuỳ vào web của bạn là gì, ví dụ web dành cho khách đến coi, nhiều traffice, để load một page mà cần phải connect về mysql chục lần để lấy dữ liệu thì hẳn nhiên là không tốt

Nhưng với web sử dụng nội bộ, đặc biệt là các tool quản lý có dữ liêu và phan quyền phức tạp, thì về connect về database nhiều lần cho 1 khi mở 1 page theo mình là bình thường.

Cái này là mình nói là nhiều lần hay ít lần thôi, còn kỹ thuật tuong tác với datbase sao cho hiệu quả thì chắc phai chờ dân “pro” đưa ý kiến.

Riêng về phần check login, thì cá nhân mình mỗi lần load 1 page là mình check login lại :slight_smile:

3 Likes

Dạ làm thế nào để biết đc session name của user vậy ạ ? Mong anh nói rõ thêm

Uhm, tớ không phải chuyên gia PHP, cơ mà tớ có thấy cậu lưu trữ session ở $_SESSION.
Khi app của cậu nhận được request xóa user hiện tại, cậu có thể lấy được user ID từ session bằng $_SESSION["user_id"], rồi sau đó xóa user đó đi trong DB.
Sau khi xóa xong, tớ nghĩ cậu có thể xóa được nội dung trong $_SESSION chứ? :smile:

Cậu không cần biết “session name” của user (thực ra không có session name đâu cậu :smile: )

4 Likes

Hi Devil Chan
Việc tạo nhiều hơn 1 kết nối không có vấn đề gì cả ( connection pool). Bản thân CSDL cũng có các cơ chế giới hạn số lượng kết nối và nếu các kết nối không làm việc sẽ tự động đóng (sau 8h). Vấn đề duy nhất là việc quản lý kết nối và sử dụng nó vì khi CSDL đã tới hạn thì tạo thêm kết nối không giải quyết vấn đề.

4 Likes

@library Cho em hỏi session là do server tạo ra với một session ID random thì làm sao mình tìm được sessionID của user đó để xóa?

:smile:

Nếu tớ không nhầm, ở PHP mỗi session được lưu hết thông tin vào $_SESSION. Cậu thực ra không cần phải tìm kiếm theo session ID để xóa session đó đi, mà xóa theo reference $_SESSION.
Mở rộng ra, trong TH cậu có một API riêng lưu trữ session, mỗi request gửi lên sẽ có session ID đi kèm. Khi cậu nhận được request “hãy xóa tài khoản của tôi”, cậu nên có session ID của người đang đề cập điều đó.
Đó cũng là 1 flow cho chức năng logout cơ bản đó cậu :smile:

Hope it helps!

5 Likes

Người dùng tự drop thì tương tự logout cái này đơn giản . Ý em là khi admin xóa user ấy , khi user vi phạm , admin xóa trong lúc user vẫn đang hoạt động .

Hì, tớ tò mò chút, sao cậu không đề cập việc này tại post đầu tiên của 3 ngày trước? :smile: Như thế sẽ tiết kiệm được 3 ngày thảo luận của tất cả mọi người đấy! :smile:


PHP session đơn thuần không có cách nào để tìm các session associate với một user ID/username. Cậu buộc phải làm một trong các cách sau:

  • Check DB để biết user này đã bị xóa hay chưa ở mọi thao tác. Đó là cách mà cậu proposed.
  • Sử dụng một data storage khác để lưu trữ session, như redis. Cậu sẽ lưu sessionID (lấy từ PHP’s sessionId) trên đây, với key là username, mỗi khi session mới được tạo ra, và xóa session đó trên cả redis khi session đó bị hủy.
    Khi chức năng admin xóa user được kích hoạt ở trên, cậu chỉ đơn giản lấy hết session ID liên kết với user trong redis, rồi xóa session đó trong PHP. Tham khảo link dưới đây cho việc xóa 1 session khi biết session ID trong PHP:
    https://www.php.net/manual/en/function.session-destroy.php#114709

Tớ recommend cách thứ 2, vì hiển nhiên gọi DB cho tất cả mọi request sẽ rất tốn kém. Cùng với đó, tìm kiếm thông tin trên redis sẽ nhanh hơn rất nhiều.


Lần tới cậu mô tả rõ vấn đề của cậu từ đầu nhé! :smile: Thông tin về use case sẽ rất có ích để thiết kế ra solution.

3 Likes

Có nhiều cách, một cách làm đơn giản trong table “user” có tạo 1 column là login_session (ví dụ thôi, đặt tên gì cũng duoc), giá trị của nó là random string nào đó.

Khi user login thành công, thì tạo 1 string có gia trị random, lưu string này vộ 2 chỗ: #1 là vô database chỗ login_session, #2 là vô $_SESSION[‘login_session’].

Nghĩa là khi user đang login, thì 2 giá trị này phải khớp với nhau, đồng nghĩa với việc mỗi khi load một page, bạn phải check giá trỉ của 2 thằng này

Khi admin cần force logout một user nào đó, chỉ cần thay đổi giá trị trong login_session chỗ database là xong.

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?