Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Analisis ringkas tentang sebab dan penyelesaian untuk menetapkan sesi tidak tamat tempoh dalam PHP

Analisis ringkas tentang sebab dan penyelesaian untuk menetapkan sesi tidak tamat tempoh dalam PHP

PHPz
PHPzasal
2023-04-04 09:27:301011semak imbas

Dengan pembangunan berterusan teknologi Web, semakin banyak tapak web menggunakan teknologi Sesi untuk menyimpan status log masuk pengguna dan maklumat lain. Apabila menggunakan PHP untuk membangunkan aplikasi web, mekanisme Sesi PHP juga merupakan kaedah yang paling banyak digunakan. Walau bagaimanapun, kadangkala kami menghadapi masalah sedemikian: walaupun kami menetapkan masa tamat tempoh Sesi, Sesi masih tidak boleh dimusnahkan secara automatik selepas masa tamat tempoh. Artikel ini menerangkan masalah dan menyediakan beberapa penyelesaian.

1. Apakah itu Sesi?

Sesi ialah mekanisme untuk menyimpan data pengguna di bahagian pelayan. Apabila pengguna melawat tapak web buat kali pertama, pelayan mencipta ID Sesi unik untuk pengguna dan menyimpan ID dalam kuki pengguna. Selepas itu, setiap kali pengguna menghantar permintaan, pelayan akan mencari data Sesi yang sepadan berdasarkan ID Sesi. Melalui Sesi, aplikasi web boleh merekodkan status dan tingkah laku pengguna, seperti status log masuk, kandungan troli beli-belah, sejarah carian, dsb.

2. Masa tamat sesi

Masa tamat sesi merujuk kepada tempoh masa dari apabila Sesi dibuat hingga apabila data Sesi dimusnahkan secara automatik. Dalam PHP, masa tamat Sesi boleh ditentukan dengan menetapkan "cookie_lifetime" dan "gc_maxlifetime" Sesi. Antaranya, "cookie_lifetime" menentukan masa kemandirian ID Sesi dalam kuki klien dan "gc_maxlifetime" menentukan masa kemandirian data Sesi dalam memori pelayan. Jika kuki pelanggan tamat tempoh, atau data Sesi dalam memori pelayan tamat tempoh, data Sesi akan dimusnahkan.

Dalam PHP, anda boleh menetapkan masa tamat tempoh Sesi melalui kod berikut:

// 设置Session过期时间为1小时
session_set_cookie_params(3600);
ini_set('session.gc_maxlifetime', 3600);
session_start();

Dalam kod di atas, kami menetapkan masa tamat tempoh Sesi kepada 1 jam. Khususnya, fungsi "session_set_cookie_params()" digunakan untuk menetapkan masa kemandirian ID Sesi dalam kuki klien, dalam beberapa saat. Fungsi "ini_set()" digunakan untuk menetapkan masa kemandirian data Sesi dalam memori pelayan, juga dalam beberapa saat. Akhir sekali, kami memanggil fungsi "session_start()" untuk memulakan Sesi.

3 Sebab mengapa Sesi tidak tamat tempoh

Walaupun kita boleh menentukan masa tamat tempoh Sesi dengan menetapkan "cookie_lifetime" dan "gc_maxlifetime" Sesi, kadangkala kita dapati bahawa walaupun jika masa tamat ditetapkan, Sesi masih tidak akan dimusnahkan secara automatik. Ini mungkin disebabkan oleh sebab berikut:

3.1 Fail sesi tidak dipadamkan

Secara lalai, PHP akan menyimpan data Sesi dalam direktori sementara pelayan, menyimpannya dalam borang daripada fail. Jika fail Sesi tidak dipadamkan selepas Sesi tamat tempoh, data Sesi akan sentiasa wujud dalam pelayan sehingga dipadamkan secara manual.

Masalah ini boleh diselesaikan dengan mengubah suai item konfigurasi "session.save_path" PHP. Kami boleh menyimpan data Sesi dalam direktori lain, atau menyimpan data Sesi terus dalam pangkalan data untuk mengelakkan situasi di mana fail Sesi tidak dipadamkan.

3.2. Mekanisme kutipan sampah sesi tidak didayakan

Dalam PHP, masa kemandirian data Sesi dalam memori pelayan dikawal oleh mekanisme kutipan sampah Sesi. Secara lalai, mekanisme pengumpulan sampah Sesi PHP dimatikan. Jika mekanisme pengumpulan sampah Sesi tidak didayakan, data Sesi akan sentiasa wujud dalam memori pelayan sehingga dipadamkan secara manual.

Untuk menyelesaikan masalah ini, kami boleh menghidupkan item konfigurasi "session.gc_probability" dan "session.gc_divisor" PHP dan biarkan PHP membersihkan data Sesi yang telah tamat tempoh secara kerap. Contohnya, tetapkan mekanisme kutipan sampah Sesi melalui kod berikut:

ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

Dalam kod di atas, "session.gc_probability" menentukan kebarangkalian melaksanakan kutipan sampah dalam setiap permintaan dan nilainya adalah antara 0 dan 100 antara, mewakili peratusan kebarangkalian. Dan "session.gc_divisor" mewakili penyebut kebarangkalian bagi setiap permintaan. Oleh itu, kod di atas menyatakan bahawa mekanisme kutipan sampah akan dilakukan setiap 100 permintaan.

3.3. Data Sesi digunakan

Jika program masih menggunakan data Sesi selepas Sesi tamat tempoh, data Sesi tidak akan dimusnahkan secara automatik. Oleh itu, kita perlu memastikan bahawa atur cara tidak lagi menggunakan data Sesi selepas Sesi tamat tempoh.

Untuk menyelesaikan masalah ini, kami boleh menambah kod berikut pada program untuk memastikan program tidak lagi menggunakan data Sesi selepas Sesi tamat:

if (isset($_SESSION) && time() - $_SESSION['start_time'] > 3600) {
    session_unset();
    session_destroy();
}

Dalam kod di atas, kami menilai Sama ada data Sesi telah tamat tempoh Jika ia telah tamat tempoh, gunakan fungsi "session_unset()" dan "session_destroy()" untuk memusnahkan data Sesi.

4. Kaedah untuk menyelesaikan masalah Sesi tidak tamat

Untuk mengelakkan masalah Sesi tidak tamat, kita boleh menggunakan kaedah berikut:

4.1 masa tamat tempoh Sesi

Nyatakan masa tamat Sesi dengan menetapkan "cookie_lifetime" dan "gc_maxlifetime" Sesi. Perlu diingat bahawa nilai "gc_maxlifetime" mestilah lebih kecil daripada nilai "cookie_lifetime", jika tidak, ia boleh menyebabkan masa tamat sesi yang tidak konsisten.

4.2. Konfigurasikan kaedah storan sesi

Simpan data sesi dalam direktori atau pangkalan data lain untuk mengelakkan situasi di mana fail sesi tidak dipadamkan.

4.3 Kosongkan data sesi secara manual

Kosongkan data sesi secara manual dalam program untuk memastikan data sesi boleh dimusnahkan dengan betul selepas tamat tempoh.

4.4. Gunakan Alat Pengurusan Sesi

Alat pengurusan sesi boleh membantu kami mengurus data Sesi dengan lebih mudah, seperti memantau status Sesi, mengosongkan data Sesi yang telah tamat tempoh, memampatkan data Sesi, dsb.

5. Kesimpulan

Sesi ialah mekanisme yang sangat penting apabila membangunkan aplikasi web menggunakan PHP. Dengan menggunakan Sesi, kami boleh menyimpan maklumat status dan tingkah laku pengguna untuk meningkatkan pengalaman dan keselamatan pengguna. Walau bagaimanapun, kegagalan sesi untuk tamat tempoh adalah masalah biasa, yang memerlukan kami menyelesaikannya dengan menetapkan masa tamat tempoh sesi, mengkonfigurasi kaedah storan sesi, mengosongkan data sesi secara manual atau menggunakan alat pengurusan sesi. Apabila membangunkan aplikasi, kami perlu melaksanakan pengurusan Sesi yang munasabah berdasarkan keperluan khusus.

Atas ialah kandungan terperinci Analisis ringkas tentang sebab dan penyelesaian untuk menetapkan sesi tidak tamat tempoh dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn