Periksa apakah sesi PHP sudah dimulai

461

Saya memiliki file PHP yang kadang-kadang dipanggil dari halaman yang memulai sesi dan terkadang dari halaman yang tidak memulai sesi. Karenanya ketika saya menggunakan session_start()skrip ini saya terkadang mendapatkan pesan kesalahan untuk "sesi sudah dimulai". Untuk itu saya berikan baris berikut:

if(!isset($_COOKIE["PHPSESSID"]))
{
  session_start();
}

tapi kali ini saya mendapat pesan peringatan ini:

Pemberitahuan: Variabel tidak terdefinisi: _SESSION

Apakah ada cara yang lebih baik untuk memeriksa apakah sesi sudah dimulai?

Jika saya menggunakan @session_startakankah hal itu berfungsi dengan baik dan hanya menutup peringatan?

Logan
sumber
Lihat juga jawaban Stackoverflow ini: stackoverflow.com/questions/1545357/…
contact-form.co_you_go

Jawaban:

761

Cara yang disarankan untuk versi PHP> = 5.4.0, PHP 7

if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

Referensi: http://www.php.net/manual/en/function.session-status.php

Untuk versi PHP <5.4.0

if(session_id() == '') {
    session_start();
}
lovelyramos
sumber
1
Saya pikir ada masalah dengan solusi untuk PHP <5.4. session_id diatur, sesi waktu PERTAMA dimulai, tetapi tidak dihapus ketika sesi ditutup. Jadi misalnya, jika ada, sebelum cuplikan Anda, kode seperti session_start();session_write_close();: maka kondisi jika gagal tetapi kami tidak memiliki sesi terbuka ...
Nicolò Martini
@Nicolo Martini Seperti yang saya pahami: Sesi dimulai dengan session_start()di bagian atas skrip TUTUP ketika skrip keluar, ATAU kapan session_write_closed()dipanggil sebelum skrip keluar. Yaitu sesi TUTUP ketika datanya ditulis ke cookie sesi dan sesi tidak dikunci untuk diakses oleh skrip lain yang juga menyebut 'session_start'. PENUTUP TIDAK berarti bahwa sesi ini DIHANCURKAN. Anda dapat menutup sesi dengan keluar dari skrip atau panggilan saat ini session_write_close(), dan Anda dapat membukanya lagi dengan menelepon session_start(). Pemahaman saya, setidaknya.
Stefan
1
Apakah ini masih cara yang baik untuk memulai sesi? Karena di tautan tidak ada yang terkait dengan jawaban ini
csandreas1
@ csandreas1 Anda akan melihat dari tautan deskripsi session_status dan nilai pengembalian yang diharapkan. Jawaban atas pertanyaan Anda adalah ya!
lovelyramos
Saya pernah mengalami kegagalan ini dalam beberapa keadaan - Saya telah menggunakan if (! Isset ($ _ SESSION)) dengan sukses
Scott
161

Untuk versi PHP sebelum PHP 5.4.0:

if(session_id() == '') {
    // session isn't started
}

Meskipun, IMHO, Anda harus benar-benar berpikir tentang refactoring kode manajemen sesi Anda jika Anda tidak tahu apakah sesi dimulai atau tidak ...

Yang mengatakan, pendapat saya subjektif, dan ada beberapa situasi (contoh yang dijelaskan dalam komentar di bawah) di mana mungkin tidak mungkin untuk mengetahui apakah sesi dimulai.

Alex
sumber
37
Itu tidak selalu buruk untuk tidak tahu apakah sesi Anda dimulai. Jika Anda malas memuat (hanya memulai sesi saat pertama kali diperlukan) maka tes dalam jawaban Anda akan baik-baik saja.
drewm
1
Juga di beberapa lingkungan, apache memiliki sesi autostarting yang diatur
LeonardChallis
Contoh untuk pengujian jika session_id () mengembalikan string kosong dalam file sertakan:
tgoneil
3
Komentar tentang manajemen sesi refactoring jika Anda tidak tahu apakah itu di-tart atau tidak benar-benar relevan. Misalnya, jika mengkodekan fitur-fitur canggih ke dalam tema WordPress Anda tidak akan pernah tahu jika sebuah plugin sudah mulai menggunakan sesi tanpa memeriksa. Dunia pengkodean tidak selalu hitam dan putih: P
Jimbo Jonny
Mmm, poin bagus memang. Saya mengakui bahwa komentar saya sangat subyektif - saya akan mengubah jawaban saya untuk mencerminkan ini.
Alex
71

PHP 5.4 memperkenalkan session_status () , yang lebih dapat diandalkan daripada mengandalkan session_id().

Pertimbangkan cuplikan berikut:

session_id('test');
var_export(session_id() != ''); // true, but session is still not started!
var_export(session_status() == PHP_SESSION_ACTIVE); // false

Jadi, untuk memeriksa apakah sesi dimulai, cara yang disarankan dalam PHP 5.4 adalah sekarang:

session_status() == PHP_SESSION_ACTIVE
Benjamin
sumber
3
Cuplikan kode yang menggunakan session_status bila tersedia dan metode yang lebih lama ketika tidak akan tampak sempurna di sini BTW, petunjuk petunjuk :)
Jimbo Jonny
1
Terima kasih atas pembaruan Benjamin. Baik untuk mengetahui bahwa metode baru dapat digunakan pada PHP 5.4.
Logan
1
Ini adalah cara yang jauh lebih baik untuk memeriksa ini, Anda tidak selalu tahu apakah Anda memiliki sesi yang dimulai terutama ketika pengguna menghapus cookie ketika mereka berada di tengah-tengah menelusuri situs ... Saya selalu kode untuk 2 tahun, Anda tidak pernah tahu apa yang akan dilakukan pengguna ;-) Adapun saya sendiri saya memiliki file Config.php kecil yang dipanggil pada semua skrip saya untuk mengatur variabel dan info lainnya jadi hanya menambahkan ini dalam file itu selalu memastikan bahwa sesi dimulai jika itu diperlukan
Andy Braham
35

Anda dapat melakukan ini, dan itu sangat mudah.

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

Semoga bermanfaat :)

miyuru
sumber
6
@ zloctb: Saya tidak bisa memikirkan situasi apa pun yang akan saya lakukan $_SESSION=array();, jadi jawaban ini sepertinya oke.
halfer
5
@halfer Lihat jawaban Ryan. Jika session_destroy()sudah dipanggil maka $_SESSIONmasih bisa diatur. Selain itu, dalam pengujian unit, Anda dapat mengatur $_SESSIONsecara langsung. Tapi saya membenarkan ini, karena untuk sebagian besar situasi praktis jawaban ini harus cukup baik (sampai PHP 5.3 tidak pernah terlihat lagi ...)
Darren Cook
22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }
k.bon
sumber
21

Sebelum PHP 5.4 tidak ada cara yang dapat diandalkan untuk mengetahui selain menetapkan bendera global.

Mempertimbangkan:

var_dump($_SESSION); // null
session_start();
var_dump($_SESSION); // array
session_destroy();
var_dump($_SESSION); // array, but session isn't active.

Atau:

session_id(); // returns empty string
session_start();
session_id(); // returns session hash
session_destroy();
session_id(); // returns empty string, ok, but then
session_id('foo'); // tell php the session id to use
session_id(); // returns 'foo', but no session is active.

Jadi, sebelum PHP 5.4 Anda harus menetapkan boolean global.

RY
sumber
12

Untuk semua versi php

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}
supersuphot
sumber
1
Demikian pula, orang juga bisa melakukannyaif ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
Anthony Hatzopoulos
9

Periksa ini :

<?php
/**
* @return bool
*/
function is_session_started()
{
    if ( php_sapi_name() !== 'cli' ) {
        if ( version_compare(phpversion(), '5.4.0', '>=') ) {
            return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE;
        } else {
            return session_id() === '' ? FALSE : TRUE;
        }
    }
    return FALSE;
}

// Example
if ( is_session_started() === FALSE ) session_start();
?>

Sumber http://php.net

Elshan
sumber
6

Gunakan session_id () , ia mengembalikan string kosong jika tidak disetel. Ini lebih dapat diandalkan daripada memeriksa $_COOKIE.

if (strlen(session_id()) < 1) {
    session_start();
}
Wesley van Opdorp
sumber
5
if (session_id() === "") { session_start(); }

semoga membantu!

Mahesh Cheliya
sumber
5

Ini harus bekerja untuk semua versi PHP. Ini menentukan versi PHP, kemudian memeriksa untuk melihat apakah sesi dimulai berdasarkan versi PHP. Kemudian jika sesi tidak dimulai itu memulainya.

function start_session() {
  if(version_compare(phpversion(), "5.4.0") != -1){
    if (session_status() == PHP_SESSION_NONE) {
      session_start();
    }
  } else {
    if(session_id() == '') {
      session_start();
    }
  }
}
Dustin Poissant
sumber
4

Satu-satunya hal yang perlu Anda lakukan adalah:

<?php
if(!isset($_SESSION))
{
session_start();
}
?>
pengguna3140580
sumber
Ini yang saya gunakan selama bertahun-tahun. Adakah yang menyarankan untuk tidak menggunakan yang ini? Tentu saja baik untuk menggunakan pemeriksaan apakah sesi dimulai kadang-kadang - di beberapa lingkungan apache memiliki sesi autostarting, pemuatan malas (hanya memulai sesi ketika pertama kali diperlukan) atau hanya bahwa kadang-kadang seseorang hanya perlu melakukan peretasan cepat
K Kilian Lindberg
ADALAH RESPON YANG SAMA DI ATAS (@miyuru)
2

Tidak yakin tentang efisiensi solusi semacam itu, tetapi ini dari proyek kerja. Ini juga digunakan jika Anda perlu mendefinisikan bahasa default

   /**
    * Start session
    * Fall back to ukrainian language
    */
   function valid_session() {
    if(session_id()=='') {
        session_start();
        $_SESSION['lang']='uk';
        $_SESSION['lang_id']=3;
    }
    return true;
  }
Alex Khimich
sumber
2

@ sebelum panggilan fungsi menekan kesalahan yang mungkin dilaporkan selama panggilan fungsi.

Menambahkan @sebelum session_startmemberitahu PHP untuk menghindari pencetakan pesan kesalahan.

Sebagai contoh:

Menggunakan session_start()setelah Anda telah mencetak sesuatu ke browser menghasilkan kesalahan sehingga PHP akan menampilkan sesuatu seperti "header tidak dapat dikirim: dimulai pada (baris 12)", @session_start()masih akan gagal dalam hal ini, tetapi pesan kesalahan tidak dicetak pada layar.

Sebelum memasukkan file atau mengalihkan ke halaman baru gunakan exit()fungsi, jika tidak maka akan memberikan kesalahan.

Kode ini dapat digunakan dalam semua kasus:


    <?php 
        if (session_status() !== PHP_SESSION_ACTIVE || session_id() === ""){
            session_start(); 
        }
    ?>
sangram desai
sumber
1

Pada PHP 5.3 ini bekerja untuk saya:

if(!strlen(session_id())){
    session_name('someSpecialName');
    session_start();
} 

maka kamu punya. Jika Anda tidak menempatkan pernyataan tidak pada jika memulai sesi akan mulai dengan cara apa pun saya tidak mengapa.

Lucas M. Oliveira
sumber
1

Respons BERDASAR pada Respons @Meliza Ramos (lihat respons pertama) dan http://php.net/manual/en/function.phpversion.php ,

AKSI:

  • tentukan PHP_VERSION_ID jika tidak ada
  • tentukan fungsi untuk memeriksa versi berdasarkan PHP_VERSION_ID
  • tentukan fungsi untuk openSession () aman

hanya menggunakan openSession ()

    // PHP_VERSION_ID is available as of PHP 5.2.7, if our
    // version is lower than that, then emulate it
    if (!defined('PHP_VERSION_ID')) {
        $version = explode('.', PHP_VERSION);

        define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));


        // PHP_VERSION_ID is defined as a number, where the higher the number
        // is, the newer a PHP version is used. It's defined as used in the above
        // expression:
        //
        // $version_id = $major_version * 10000 + $minor_version * 100 + $release_version;
        //
        // Now with PHP_VERSION_ID we can check for features this PHP version
        // may have, this doesn't require to use version_compare() everytime
        // you check if the current PHP version may not support a feature.
        //
        // For example, we may here define the PHP_VERSION_* constants thats
        // not available in versions prior to 5.2.7

        if (PHP_VERSION_ID < 50207) {
            define('PHP_MAJOR_VERSION',   $version[0]);
            define('PHP_MINOR_VERSION',   $version[1]);
            define('PHP_RELEASE_VERSION', $version[2]);

            // and so on, ...
        }
    }

    function phpVersionAtLeast($strVersion = '0.0.0')
    {
        $version = explode('.', $strVersion);

        $questionVer = $version[0] * 10000 + $version[1] * 100 + $version[2];

        if(PHP_VERSION_ID >= $questionVer)
            return true;
        else
            return false;

    }

    function openSession()
    {
        if(phpVersionAtLeast('5.4.0'))
        {
            if(session_status()==PHP_SESSION_NONE)
                session_start();
        }
        else // under 5.4.0
        {
            if(session_id() == '')
                session_start();
        }
    }

sumber
1
if (version_compare(PHP_VERSION, "5.4.0") >= 0) {
    $sess = session_status();
    if ($sess == PHP_SESSION_NONE) {
        session_start();
    }
} else {
    if (!$_SESSION) {
        session_start();
    }
}

Sebenarnya, sekarang sudah terlambat untuk menjelaskannya di sini karena sudah diselesaikan. Ini adalah file .inc dari salah satu proyek saya di mana Anda mengkonfigurasi menu untuk restoran dengan memilih hidangan dan menghapus / menambah atau mengubah urutan. Server tempat saya bekerja tidak memiliki versi yang sebenarnya jadi saya membuatnya lebih fleksibel. Terserah penulis ingin menggunakan dan mencobanya.

Sangat berbahaya
sumber
1

Apakah potongan kode ini cocok untuk Anda?

if (!count($_SESSION)>0) {
    session_start();
}
Niroshan
sumber
0

Anda harus mengatur ulang kode Anda sehingga Anda menelepon session_start()tepat sekali setiap eksekusi halaman.

SAMT
sumber
4
memanggilnya tepat sekali per eksekusi halaman mungkin tidak diinginkan dalam beberapa situasi.
Timo Huovinen
Jika Anda mematikan sesi untuk membuatnya kembali, maka pasti, tapi itu adalah kasus khusus. Secara umum, aplikasi harus memiliki kode yang dijalankan di awal sekali, yang merupakan tempat session_start () berjalan.
SamT
1
misalnya, aplikasi menyimpan sesi pada file, dan perlu memuat 2 permintaan data secara bersamaan, tidak satu pun dari permintaan ini membutuhkan sesi, tetapi satu akan memblokir yang lain karena session_start mengunci file sesi.
Timo Huovinen
Persis. @ YuriKolovsky benar. Pertanyaan Alex relevan karena kasus-kasus ini dapat terjadi, dan mereka tidak jarang.
Paulo Coghi - Reinstate Monica
14
-1, Sebagian besar situs web didorong oleh CMS dan memiliki hal-hal seperti tema dan plugin, sering ditulis oleh pihak yang berbeda, tidak pernah tahu apakah masing-masing kode telah memulai sesi atau tidak. Implikasi bahwa ini hanya masalah organisasi kode adalah salah.
Jimbo Jonny
0
session_start();
if(!empty($_SESSION['user']))
{     
  //code;
}
else
{
    header("location:index.php");
}
Sukanya Suku
sumber
0

PHP_VERSION_ID tersedia mulai PHP 5.2.7, jadi periksalah ini terlebih dahulu dan jika perlu, buatlah. session_statustersedia pada PHP 5.4, jadi kami harus memeriksa ini juga:

if (!defined('PHP_VERSION_ID')) {
    $version = explode('.', PHP_VERSION);
    define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
}else{
    $version = PHP_VERSION_ID;
}
if($version < 50400){
    if(session_id() == '') {
        session_start();
    }
}else{
    if (session_status() !== PHP_SESSION_ACTIVE) {
        session_start();
    }
}
Christian Kruse
sumber
0

Berdasarkan praktik saya, sebelum mengakses $_SESSION[]Anda perlu menelepon session_startsetiap kali untuk menggunakan skrip. Lihat tautan di bawah ini untuk manual.

http://php.net/manual/en/function.session-start.php

Bagi saya setidaknya session_startmembingungkan sebagai nama. A session_loadbisa lebih jelas.

Eduard Hasanaj
sumber
0

Saya berakhir dengan periksa status. php 5.4+

if(session_status() !== PHP_SESSION_ACTIVE){session_start();};
if(session_status() !== PHP_SESSION_ACTIVE){die('session start failed');};
Leo Tahk
sumber
0

Anda dapat menggunakan solusi berikut untuk memeriksa apakah sesi PHP sudah dimulai:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}
Manjeet Kumar Nai
sumber
Jawaban yang valid lebih detail.
Clément Prévost
0

Ini yang saya gunakan untuk menentukan apakah sesi sudah dimulai. Dengan menggunakan kosong dan keluarkan sebagai berikut:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}
Rotimi
sumber
-3

Ganti session_start();dengan:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}
Harshit Chaturvedi
sumber
ini berisi kesalahan kode dan hanya akan berfungsi, jika file yang sama akan dimasukkan beberapa kali, tetapi tidak jika dalam penutupan.
BananaAcid