Hướng dẫn php session garbage collection - bộ sưu tập rác phiên php

(Php 7> = 7.1.0, Php 8)

session_gc - thực hiện bộ sưu tập rác dữ liệu phiênPerform session data garbage collection

Sự mô tả

session_gc (): int | false(): int|false

GC dựa trên xác suất hoạt động phần nào nhưng nó có ít vấn đề. 1) Dữ liệu phiên của các trang web lưu lượng truy cập thấp có thể không bị xóa trong thời lượng ưa thích. 2) GC của các trang web giao thông cao có thể là GC quá thường xuyên. 3) GC được thực hiện theo yêu cầu của người dùng và người dùng sẽ gặp phải độ trễ của GC.

Do đó, nên thực hiện GC định kỳ cho các hệ thống sản xuất bằng cách sử dụng, ví dụ: "Cron" cho các hệ thống giống như Unix. Đảm bảo vô hiệu hóa GC dựa trên xác suất bằng cách đặt phiên.GC_PROBILE thành 0.

Thông số

Chức năng này không có tham số.

Trả về giá trị

session_gc () Trả về số lượng dữ liệu phiên đã xóa để thành công, false cho thất bại. returns number of deleted session data for success, false for failure.

Trình xử lý lưu cũ không trả về số lượng dữ liệu phiên đã xóa, mà chỉ là cờ thành công/thất bại. Nếu đây là trường hợp, số lượng dữ liệu phiên bị xóa đã trở thành 1 bất kể dữ liệu thực sự bị xóa.

Ví dụ

Ví dụ #1 session_gc () Ví dụ cho người quản lý nhiệm vụ như Cronsession_gc() example for task managers like cron

<?php
// Note: This script should be executed by the same user of web server process.

// Need active session to initialize session data storage access.

session_start();// Executes GC immediately
session_gc();// Clean up session ID created by session_gc()
session_destroy();
?>

Ví dụ #2 session_gc () Ví dụ cho tập lệnh người dùng có thể truy cậpsession_gc() example for user accessible script

<?php
// Note: session_gc() is recommended to be used by task manager script, but
// it may be used as follows.

// Used for last GC time check

$gc_time '/tmp/php_session_last_gc';
$gc_period 1800;session_start();
// Execute GC only when GC period elapsed. 
// i.e. Calling session_gc() every request is waste of resources. 
if (file_exists($gc_time)) {
    if (
filemtime($gc_time) < time() - $gc_period) {
        
session_gc();
        
touch($gc_time);
    }
} else {
    
touch($gc_time);
}
?>

Xem thêm

  • session_start () - Bắt đầu phiên mới hoặc tiếp tục phiên hiện có
  • session_destroy () - Phá hủy tất cả dữ liệu được đăng ký vào phiên
  • session.gc_probability

Không có người dùng đóng góp ghi chú cho trang này.

Từ hướng dẫn sử dụng PHP, phiên.gc_probability và session.gc_divisor mà GC sẽ xảy ra dựa trên xác suất này. Tôi nhận được điều đó.

Điều tôi không rõ là liệu xác suất này có trên một phiên theo cơ sở phiên hay tổng thể hay không.

Vì vậy, nếu xác suất của tôi là 1% (1/100) mà GC sẽ xảy ra, điều đó có nghĩa là nếu một phiên tiếp tục được mở rộng, mỗi lần có 1% thay đổi mà phiên cụ thể sẽ được làm sạch? Hoặc điều này có nghĩa là 1% của tất cả các phiên hiện có (cũng như các phiên mới) sẽ kích hoạt GC cho tất cả các phiên hiện có khác?

Tôi khá chắc chắn đó là cái sau, tôi chỉ muốn chắc chắn.

Mục đích của câu hỏi này là trên trang web của chúng tôi, tôi muốn người dùng có các phiên dài hạn (6 tháng). Nếu 1% của tất cả các phiên kích hoạt GC, thì điều đó sẽ loại bỏ hiệu quả mục đích của việc có phiên dài hạn đó, vì GC sẽ kết thúc xảy ra mỗi giờ hoặc hai giờ.

Kara

6.01416 Huy hiệu vàng 50 Huy hiệu bạc57 Huy hiệu đồng16 gold badges50 silver badges57 bronze badges

Hỏi ngày 19 tháng 10 năm 2011 lúc 22:26Oct 19, 2011 at 22:26

Hướng dẫn php session garbage collection - bộ sưu tập rác phiên php

3

Mỗi khi tập lệnh PHP được thực thi và bắt đầu phiên, có khả năng nó sẽ quét qua thư mục phiên tiêu diệt phiên cũ.

Dọn dẹp sẽ chỉ xóa các phiên không được truy cập trong một thời gian nhất định. Tuy nhiên, PHP không đảm bảo rằng phiên sẽ bị phá hủy trong thời gian đó.

Chiến lược phiên dài hạn của bạn sẽ hoạt động tốt, nhưng bạn có thể muốn giảm 1% xuống còn 0,1%

Một điều khác cần chú ý là hệ điều hành có thể làm sạch thư mục /TMP của bạn trong quá trình khởi động lại, vì vậy ngay cả khi PHP không làm điều đó.

Đã trả lời ngày 19 tháng 10 năm 2011 lúc 22:32Oct 19, 2011 at 22:32

Romaninshromaninshromaninsh

10,5K4 Huy hiệu vàng47 Huy hiệu bạc70 Huy hiệu đồng4 gold badges47 silver badges70 bronze badges

5

Lần trước tôi nhìn vào nguồn mỗi cuộc gọi đến session_start () "cuộn xúc xắc" để nói, sử dụng ước số và xác suất. Nếu bạn nhấn, thì nó sẽ xóa tất cả các tệp khỏi thư mục session.save_path cũ hơn session.gc_maxlifetime. Tôi quên nếu nó sử dụng thời gian sửa đổi hoặc truy cập của tệp, mặc dù nó không quan trọng trong các curcumstances bình thường vì PHP ghi đè lên tệp phiên theo mặc định khi kết thúc thực thi tập lệnh, do đó, thời gian truy cập và thời gian truy cập hầu như luôn luôn khớp rất chặt.

// Rough psuedo code of how php's session_start() function works regarding garbage collection.
function session_start() {
    $percentChanceToGC = 100 * ini_get('session.gc_probability') / ini_get('session.session.gc_divisor');
    $shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC;
    if ($shouldDoGarbageCollection) {
        $expiredCutoffTime = time() - ini_get('session.gc_maxlifetime');
        foreach (scandir(ini_get('session.save_path')) as $sessionFile) {
            if (filemtime($sessionFile) < $expiredCutoffTime) {
                unlink($sessionFile);
            }
        }
    }

    // ... rest of code ....
}

Tôi không biết có bao nhiêu tệp phiên mà bạn sẽ kết thúc việc quanh quẩn nếu bạn muốn chúng sống tối thiểu 6 tháng. Hãy xem xét nó có thể mất một chút thời gian để PHP để thống kê hàng ngàn tệp để xác định tuổi của họ. Có thể xem xét các tùy chọn khác để lưu trữ bền của dữ liệu này. Hoặc bạn có thể vô hiệu hóa PHP GC và chỉ chạy một công việc cron để xóa các tệp phiên cũ. Mặt khác, 1% yêu cầu sẽ kích hoạt GC và phải chờ PHP; Nói cách khác, nó có thể bị trễ.

Đã trả lời ngày 19 tháng 10 năm 2011 lúc 23:04Oct 19, 2011 at 23:04

goat

30.7K7 Huy hiệu vàng70 Huy hiệu bạc96 Huy hiệu Đồng7 gold badges70 silver badges96 bronze badges

Tôi không phải là một chuyên gia về điều này, nhưng từ việc đọc hướng dẫn, tôi sẽ thu hút sự chú ý của bạn đến một bối cảnh khác, session.gc_maxlifetime. Từ các tài liệu:

session.gc_maxlifetime Chỉ định số giây sau đó dữ liệu sẽ được xem là 'rác' và có khả năng được làm sạch. Bộ sưu tập rác có thể xảy ra trong phiên bắt đầu (tùy thuộc vào false2 và false3).

Vì vậy, nếu bạn đặt cài đặt này thành một giá trị phù hợp (false4 trong nửa năm, vì vậy false5), thì dữ liệu phù hợp sẽ không đủ điều kiện để thu gom rác, bất kể cài đặt khác là gì.

Đã trả lời ngày 19 tháng 10 năm 2011 lúc 22:32Oct 19, 2011 at 22:32

Lonesomedaylonesomedaylonesomeday

227K49 Huy hiệu vàng311 Huy hiệu bạc313 Huy hiệu Đồng49 gold badges311 silver badges313 bronze badges

3