Các phiên PHP đã được bắt đầu


81

Trong mã PHP của tôi, nếu một phiên đã bắt đầu và tôi cố gắng bắt đầu một phiên mới, tôi nhận được Thông báo sau:

Thông báo: Một phiên đã được bắt đầu - bỏ qua session_start ()

Làm thế nào tôi có thể tránh điều này?


3
Không bắt đầu một phiên mới nếu một phiên cũ đang chạy?
Madara's Ghost

có thể trùng lặp của Làm thế nào để biết một phiên đang hoạt động? - vui lòng sử dụng tìm kiếm trước khi đặt câu hỏi.
hakre

Đối với tôi nó làm việc chỉ đơn giản bằng cách loại bỏ session_start (), nếu phiên đã được bắt đầu sau đó tại sao chúng ta cần phải bắt đầu nó again.In trường hợp của tôi Đó chỉ là một file config.php mà bao gồm trong mã
Mangesh Sathe

Tôi đã đưa session_start()vào một trong những bao gồm của mình và require_oncenó trong mọi tệp mà tôi cần.
nurchi

Câu trả lời:


245

Thử

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    } 
?>

Điều này làm cho việc triển khai bảo mật dễ dàng hơn nếu bạn đang sử dụng trang chính để bọc tất cả nội dung của mình.
Raymond Wachaga

Điều này cũng được khuyến nghị cho những thời điểm bạn có thể hoặc không tải tệp có chứa session_start () vì vậy thực hành tiêu chuẩn tốt
Steve Whitby

29

Nếu bạn muốn một cái mới, hãy làm session_destroy()trước khi bắt đầu nó. Để kiểm tra xem nó đã đặt chưa trước khi bắt đầu, hãy gọi session_status():

$status = session_status();
if($status == PHP_SESSION_NONE){
    //There is no active session
    session_start();
}else
if($status == PHP_SESSION_DISABLED){
    //Sessions are not available
}else
if($status == PHP_SESSION_ACTIVE){
    //Destroy current and start new one
    session_destroy();
    session_start();
}

Tôi sẽ tránh kiểm tra toàn cầu $_SESSIONthay vì của tôi kêu gọi các session_status()phương pháp kể từ PHP thực hiện chức năng này một cách rõ ràng để:

Hiển thị trạng thái phiên thông qua hàm mới, session_status Đây là dành cho (PHP> = 5.4.0)


5

Chỉ khi bạn muốn hủy phiên trước:

<?php
    if(!isset($_SESSION)) 
    { 
        session_start(); 
    }
    else
    {
        session_destroy();
        session_start(); 
    }
?>

hoặc bạn có thể sử dụng

unset($_SESSION['variable_session _data'])

để hủy một biến phiên cụ thể.


4
session_status() === PHP_SESSION_ACTIVE ?: session_start();

Trò chơi đã đóng


2

Có, bạn có thể phát hiện xem phiên đã chạy hay chưa bằng cách kiểm tra isset($_SESSION). Tuy nhiên, câu trả lời tốt nhất chỉ đơn giản là không gọi session_start()nhiều hơn một lần.

Nó nên được gọi rất sớm trong tập lệnh của bạn, có thể ngay cả dòng đầu tiên, và sau đó không được gọi lại.

Nếu bạn có nó ở nhiều nơi trong mã của mình thì bạn đang yêu cầu nhận được loại lỗi này. Cắt nó xuống để nó chỉ ở một nơi và chỉ có thể được gọi một lần.


1

Bạn phải đã được gọi là bắt đầu phiên có thể được gọi lại thông qua một bao gồm?

if( ! $_SESSION)
{
    session_start();
}  

1
Một chút muộn, nhưng vì lý do gì mà điều này không hiệu quả. Chỉ (! Isset ($ _ SESSION)) hoạt động.
Mave

2
Có nguy cơ để bắn này: Notice: Undefined variable: _SESSION. Sử dụng issetthay thế.
T30

1

Tôi đã gặp sự cố này khi cố gắng khắc phục hành vi chặn của $ _SESSION.

http://konrness.com/php5/how-to-prevent-blocking-php-requests/

Tệp phiên vẫn bị khóa cho đến khi tập lệnh hoàn tất hoặc phiên được đóng theo cách thủ công.

Vì vậy, theo mặc định, một trang sẽ mở một phiên ở chế độ chỉ đọc. Nhưng một khi nó mở ở chế độ chỉ đọc, nó phải được đóng và mở lại để đưa nó vào chế độ ghi.

const SESSION_DEFAULT_COOKIE_LIFETIME = 86400;

/**
 * Open _SESSION read-only
 */
function OpenSessionReadOnly() {
    session_start([
                      'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME,
                      'read_and_close'  => true,    // READ ACCESS FAST
                  ]);
    // $_SESSION is now defined. Call WriteSessionValues() to write out values
}

/**
 * _SESSION is read-only by default. Call this function to save a new value
 * call this function like `WriteSessionValues(["username"=>$login_user]);`
 * to set $_SESSION["username"]
 *
 * @param array $values_assoc_array
 */
function WriteSessionValues($values_assoc_array) {
    // this is required to close the read-only session and 
    // not get a warning on the next line.
    session_abort();

    // now open the session with write access
    session_start([ 'cookie_lifetime' => SESSION_DEFAULT_COOKIE_LIFETIME ]);

    foreach ($values_assoc_array as $key => $value) {
        $_SESSION[ $key ] = $value;
    }
    session_write_close();  // Write session data and end session

    OpenSessionReadOnly(); // now reopen the session in read-only mode.
}

OpenSessionReadOnly();  // start the session for this page

Sau đó, khi bạn viết một số giá trị:

WriteSessionValues(["username"=>$login_user]);

Hàm nhận một mảng các cặp khóa => giá trị để làm cho nó hiệu quả hơn.


0

thử đi

if(!isset($_SESSION)){ 
    session_start();
}

Tôi đề nghị bạn sử dụng ob_start (); trước khi bắt đầu bất kỳ sesson varriable nào, điều này sẽ đặt cho bạn bộ đệm trình duyệt.

chỉnh sửa: Đã thêm phần bổ sung) sau $ _SESSION


0

Không có cách nào ở trên là phù hợp, nếu không gọi session_start () trong tất cả các tệp php phụ thuộc vào các biến $ Session thì chúng sẽ không được đưa vào. Thông báo rất khó chịu và nhanh chóng lấp đầy Error_log. Giải pháp duy nhất mà tôi có thể tìm thấy là hiệu quả là ...

    error_reporting(E_ALL ^ E_NOTICE);
    session_start();

Một bản sửa lỗi tồi, nhưng nó hoạt động.


0

Nó sẽ hiệu quả hơn:

@session_start();

Tránh trình xử lý lỗi trong màn hình

Tốt,


0
<?php
if ( session_id() != "" ) {
    session_start();
}

Về cơ bản, bạn cần kiểm tra xem một phiên đã được bắt đầu chưa trước khi tạo một phiên khác; ... đọc thêm .

Mặt khác, bạn đã chọn hủy một phiên hiện có trước khi tạo một phiên khác bằng cách sử dụng session_destroy().


0

Chỉ cần sử dụng câu lệnh if

 if(!isset($_SESSION)) 
     { 
         session_start(); 
     }

hoặc là

kiểm tra trạng thái phiên với session_status Trả về trạng thái phiên hiện tại và nếu phiên hiện tại đã hoạt động thì không có gì khác nếu phiên không hoạt động thì bắt đầu phiên


session_status() === PHP_SESSION_ACTIVE ?: session_start();
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.