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?
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?
session_start()
vào một trong những bao gồm của mình và require_once
nó trong mọi tệp mà tôi cần.
Câu trả lời:
Thử
<?php
if(!isset($_SESSION))
{
session_start();
}
?>
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 $_SESSION
thay 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)
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.
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();
}
Notice: Undefined variable: _SESSION
. Sử dụng isset
thay thế.
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.
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
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.
<?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()
.
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();