2009-03-31 26 views
6

Mỗi khi tôi truy cập dữ liệu bằng $ _SESSION, nó có ngay lập tức cập nhật tệp phiên trên đĩa hay chỉ một lần khi quá trình này ngừng hoạt động? Hoặc mỗi n byte thay đổi dữ liệu (tuôn ra)?

Câu hỏi này không nhất thiết về trình xử lý phiên tệp cụ thể, nhưng mọi trình xử lý. (Mỗi lần chạm trong phiên ngay lập tức gọi một I/O thuộc bất kỳ loại nào, bên cạnh việc lưu trữ một biến bình thường trong bộ nhớ).

Trả lời

3

Như Matt đã viết, nó ghi vào cuối thực thi tập lệnh theo mặc định. Bạn có thể đọc về nó ở đây trong session_write_close()

phiên dữ liệu thường được lưu trữ sau khi kịch bản của bạn chấm dứt mà không có sự cần phải gọi session_write_close(), nhưng như dữ liệu phiên được khóa để ngăn chặn ghi đồng thời chỉ có một kịch bản có thể hoạt động trên một phiên tại bất kỳ thời điểm nào. Khi sử dụng bộ khung với nhau với các phiên, bạn sẽ trải nghiệm các khung hình tải từng bộ một do khóa này khóa. Bạn có thể giảm thời gian cần thiết để tải tất cả các khung hình bằng cách kết thúc phiên ngay sau khi tất cả các thay đổi về biến phiên được thực hiện ngay sau khi tất cả thay đổi.

0

Phụ thuộc vào trình xử lý. Bạn có thể viết trình xử lý của riêng bạn để đảm bảo nó chỉ xảy ra thường xuyên nếu bạn muốn nếu bạn muốn hoàn toàn chắc chắn về hành vi đó. Có 6 cuộc gọi lại được sử dụng để quản lý các biến phiên. Người được gọi là "viết" không phải thực hiện bất kỳ I/O thực nào và ghi tệp phiên có thể đợi cho đến khi cuộc gọi đến "đóng". Đó là một chi tiết thực hiện, như tôi đã nói, phụ thuộc vào trình xử lý.

+0

Nói lỗi quá trình, tôi cho rằng dữ liệu phiên không được sử dụng bị mất, đúng không? –

+0

Có, và có lẽ bất kỳ hành động cơ sở dữ liệu không được cam kết nào cũng bị mất. – jmucchiello

2

Nó viết nó và kết thúc của quá trình trên thiết lập của tôi. Tôi đã thực hiện một _ mới session_ write_method:

public function _session_write_method($id, $sess_data) { 
    var_dump(file_put_contents('/var/www/public_html/testing.txt', serialize($sess_data))); 
    return(true); 
} 

và sau đó:

$_SESSION['foo'] = 'bar'; 
while(true) 

tôi thực hiện kịch bản, chờ đợi một vài giây và sau đó chạy 'sudo kill' trên quá trình id. Nó không ghi dữ liệu được tuần tự hóa vào tệp. Tôi chạy nó một lần nữa mà không có vòng lặp vô hạn và tôi đã nhận: int (22) ở dưới cùng của trang và testing.txt đã được ghi thành công và chứa: s: 14: "foo | s: 3:" bar ";" ;

Các vấn đề liên quan