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?



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();
}

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.


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

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 :)


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();
    }
 }

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.


12

Untuk semua versi php

if ((function_exists('session_status') 
  && session_status() !== PHP_SESSION_ACTIVE) || !session_id()) {
  session_start();
}

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


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();
}


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();
    }
  }
}

4

Satu-satunya hal yang perlu Anda lakukan adalah:

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

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;
  }

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(); 
        }
    ?>

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.


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();
        }
    }

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.


1

Apakah potongan kode ini cocok untuk Anda?

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

0

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


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");
}

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();
    }
}


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');};

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";
}

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();
}

-3

Ganti session_start();dengan:

if (!isset($a)) {
    a = False;
    if ($a == TRUE) {
        session_start();
        $a = TRUE;
    }
}

ini berisi kesalahan kode dan hanya akan berfungsi, jika file yang sama akan dimasukkan beberapa kali, tetapi tidak jika dalam penutupan.
BananaAcid
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.