2012-12-20 40 views
5

Tôi gặp khó khăn khi quyết định giải pháp tối ưu cho ứng dụng web của mình là truy cập (chủ yếu là đọc) nhiều lần cùng một dữ liệu người dùng trên mỗi phiên.mysql pdo giao dịch và lưu trữ phiên

Tôi có thể truy xuất tất cả dữ liệu người dùng cùng một lúc (khoảng 40 trường) thành $ _SESSION khi mở phiên mới hoặc tôi nên duy trì kết nối PDO (mysql) liên tục và truy vấn các thông số tôi cần từ cơ sở dữ liệu. thay thế?

CŨNG:

Nên có một sự khác biệt lớn về hiệu suất giữa đọc/cập nhật rất nhiều lĩnh vực cùng một lúc (whith một truy vấn tùy chỉnh) hoặc từng cái một (với sự kết hợp tùy chỉnh các truy vấn chung) trong cùng một giao dịch? ví dụ.

$dbh = new PDO("mysql:host=localhost;dbname",$dbuser,$dbpass,array(PDO::ATTR_PERSISTENT => true)); 

$fieldlist=''; 
foreach ($fields as $i=>$field){ 
    $fieldlist.=$field['name'].':field'.$i.','; 
} 
rtrim($fieldlist,','); 
$dbh->prepare("UPDATE user SET ".$fieldlist." WHERE name=:name"); 
foreach ($fields as $i=>$field){ 
    $stmt->bindValue(':field'.$i, $field['value'], PDO::PARAM_STR); 
} 
$stmt->bindValue(':name', $name, PDO::PARAM_STR); 
$stmt->execute(); 

$dbh = null; 

vs

$dbh = new PDO("mysql:host=localhost;dbname",$dbuser,$dbpass,array(PDO::ATTR_PERSISTENT => true)); 


$dbh->beginTransaction(); 

foreach($fields as $field){ 
    $stmt=$dbh->prepare("UPDATE user SET ".$field['name']."=:field WHERE name=:name"); 
    $stmt->bindValue(':field', $field['value'], PDO::PARAM_STR); 
    $stmt->bindValue(':name', $name, PDO::PARAM_STR); 
    $stmt->execute(); 
} 

$dbh->commit(); 

$dbh = null; 
+2

Bạn không thể tuần tự hóa tài nguyên kết nối cơ sở dữ liệu vào một phiên. Tôi muốn nói rằng giải quyết rằng cuộc tranh luận. – deceze

Trả lời

1

Không thể thực hiện được. Ngay cả khi bạn có thể làm điều này, đó là một ý tưởng tồi. Bạn sẽ tạo ra một tình huống với nhiều kết nối mở đồng thời sẽ vượt quá các kết nối tối đa của bạn.

Tôi không chắc chắn lý do tại sao bạn phải liên tục cập nhật phiên với cùng một dữ liệu. Chỉ cần đặt dữ liệu trong phiên một lần, và được thực hiện.

Nếu bạn đang xử lý một tập dữ liệu lớn, bạn có thể muốn xem xét lưu vào bộ nhớ cache. Điều này sẽ làm giảm tải cơ sở dữ liệu. Bạn có thể sử dụng memcached. Điều này sẽ cải thiện hiệu suất, nó cho phép bạn chỉ định những gì và bao nhiêu tài nguyên để cache.

0

Bạn nên giữ các dữ liệu trong phiên làm việc.

Bạn không thể giữ an toàn phiên làm việc trong bất kỳ trình xử lý nào - trong trường hợp kết nối db của bạn - vì số nhận dạng trên yêu cầu tiếp theo có thể không giống nhau. Ngoài ra, giữ kết nối mở chỉ trong trường hợp có thể không phải là điều tốt nhất để làm.

Nếu bạn tải dữ liệu theo bất kỳ cách nào, chỉ cần giữ phiên - nếu bạn truy vấn nó mỗi lần, bạn sẽ sử dụng ít nhất cùng một lượng bộ nhớ, nhưng sẽ thực hiện truy vấn DB, vì vậy hiệu suất sẽ tồi tệ hơn so với chỉ giữ dữ liệu. Nếu bạn cần phải làm mới dữ liệu mỗi yêu cầu, chỉ cần làm điều đó với một kết nối mới, không cố gắng giữ cho trình xử lý kết nối trong phiên.

2

Nên có một sự khác biệt lớn trong hoạt động

tôi sẽ nói đó là một sự khác biệt trong cảm giác chung.
Tại sao phải lặp lại từng cái một trong khi bạn có thể làm điều đó cùng một lúc? Có lý do nào để viết nhiều mã hơn cho cùng một tác vụ không?
Có vẻ như bạn đang tìm kiếm những rắc rối không phải nơi họ thực sự đang ở.

+0

Bởi vì, tùy thuộc vào kịch bản (đầu vào của người dùng), tôi có thể cần phải sửa đổi các kết hợp tham số khác nhau. Tôi không quá quen thuộc với các giao dịch ACID và tôi muốn biết mức độ nút cổ chai được so sánh khi dành thời gian để tối ưu hóa các truy vấn vì vậy khi nhiều hơn một cột của một bảng cụ thể được sửa đổi trên cùng một giao dịch tôi 'd tham gia các câu lệnh trong một truy vấn thay vì bắt đầu một giao dịch, thực hiện tất cả chúng và sau đó cam kết ... – NotGaeL

+0

Dù sao, tôi tưởng tượng những gì bạn đang cố gắng nói với tôi là không nên có các chức năng nhận/cập nhật từng thông số (điều mà tôi chưa từng nghĩ đến trước khi bắt đầu đọc về PDO và giao dịch ACID), và đó là tất cả những gì tôi muốn biết, nhưng như bạn có thể thấy tôi bị mất một chút trong các khái niệm ở đây nên tôi đánh giá cao nếu bạn có thể chỉ cho tôi một số tài liệu về chủ đề mà bạn biết (ngoài PHP hướng dẫn sử dụng và wikipedia, tài liệu tham khảo hiện tại của tôi). Cảm ơn nhiều. – NotGaeL