30 মিনিটের পরে আমি কীভাবে পিএইচপি সেশনটির মেয়াদ শেষ করব?


1047

আমার একটি সেশনটি 30 মিনিটের জন্য জীবিত রাখা এবং তারপরে এটি নষ্ট করা দরকার।


35
অনুগ্রহ করে নোট করুন যে সেশন সময় নির্ধারণের জন্য কমপক্ষে দুটি সেটিংস অত্যন্ত গুরুত্বপূর্ণ, এবং সম্ভবত তিনটি। দু'টি অবশ্যই গুরুতর বিষয় হ'ল সেশন.সি_ম্যাক্সলাইফটাইম এবং সেশন কুকি_ লাইফটাইম (যেখানে 0 কিছু দীর্ঘ সংখ্যার মতো নয়)। সম্পূর্ণরূপে, দীর্ঘ সময়ের অনুমতি দেওয়ার 100% নিশ্চিততার জন্য, সেশন ফাইলগুলি সংরক্ষণ করার প্রয়োজন হতে পারে। সেভ_পথ, / টিএমপি ডিরেক্টরিতে ওএস-নিয়ন্ত্রিত ক্লিনআপ সময় বিভিন্ন কারণে যেখানে সেশন ফাইলগুলি ডিফল্টরূপে সঞ্চয় করা হয়।
কেজকাই

1
আপনি কেন অধিবেশনটির মেয়াদ শেষ করতে চান তা আমি বুঝতে পারি না। আপনি যদি উদ্বেগ প্রকাশ করেন যে ব্যবহারকারী লগ আউট না করেই তার কম্পিউটারটি ছেড়ে যায় এবং কোনও অননুমোদিত ব্যবহারকারী তার কম্পিউটারটি গ্রহণ করে, আপনার সাইটে সেশনটির মেয়াদ শেষ হওয়ার পরে ডিস্কে হাইজ্যাকারের দ্বারা ক্ষতিগ্রস্থদের ফাইল অ্যাক্সেস আটকাতে হবে না।
Gqqnbig

আপনি এখানে যা জিজ্ঞাসা করছেন তা অস্পষ্ট। আপনি কি বোঝাতে চেয়েছেন যে আপনি একটি কঠোর নিষ্ক্রিয়তার সময়সীমা বাস্তবায়ন করতে চান (বর্তমানে পিএইচপি আপনাকে আনন্দের সাথে একটি অধিবেশন ব্যবহার করতে দেবে যা সেশন.gc_max Lifetime এর চেয়ে বেশি সময় ধরে স্পর্শ করা হয়নি) বা আপনি কী বোঝাতে চেয়েছেন যে আপনি অধিবেশন 30 মিনিটের মধ্যে সীমাবদ্ধ করতে চান নিষ্ক্রিয়তা? সত্যই আমি মনে করি যে এখানে গৃহীত উত্তরগুলি সমস্যার জন্য বরং খারাপ পরামর্শ - উভয় ক্ষেত্রেই যুক্তিটি একটি কাস্টম সেশন হ্যান্ডলারের সাথে প্রয়োগ করা উচিত।
সিমকিবিয়ান

উত্তর:


1663

আপনার নিজের একটি সেশন সময়সীমা বাস্তবায়ন করা উচিত। অন্যদের দ্বারা উল্লিখিত উভয় বিকল্প ( সেশন. gc_max Life টাইম এবং অধিবেশন.কুকি_লাইফটাইম ) নির্ভরযোগ্য নয়। আমি এর কারণগুলি ব্যাখ্যা করব।

প্রথম:

অধিবেশন.সি_ম্যাক্সলাইফটাইম
সেশন.সি_ম্যাক্সালাইফটাইম সেকেন্ডের সংখ্যা নির্দিষ্ট করে যার পরে ডেটা 'আবর্জনা' হিসাবে দেখা হবে এবং পরিষ্কার হবে। অধিবেশন শুরুর সময় জঞ্জাল সংগ্রহ ঘটে।

তবে আবর্জনা সংগ্রহকারী কেবলমাত্র সেশন . gc_divisor দ্বারা বিভক্ত সেশন . gc_probability এর সম্ভাব্যতা দিয়ে শুরু করা হয়েছে । এবং এই বিকল্পগুলির জন্য ডিফল্ট মানগুলি (যথাক্রমে 1 এবং 100) ব্যবহার করে, সুযোগটি কেবল 1% এ।

ঠিক আছে, আপনি সহজেই এই মানগুলি সামঞ্জস্য করতে পারেন যাতে আবর্জনা সংগ্রহকারী আরও প্রায়শই শুরু হয়। তবে আবর্জনা সংগ্রহকারী শুরু করা হলে, এটি প্রতিটি নিবন্ধিত সেশনের জন্য বৈধতা পরীক্ষা করবে। এবং এটি ব্যয়বহুল।

তদ্ব্যতীত, পিএইচপি-র ডিফল্ট সেশন.সভে_হ্যান্ডলার ফাইলগুলি ব্যবহার করার সময়, সেশন ডেটা ফাইলগুলিতে সেশন- সেভ_প্যাথে নির্দিষ্ট একটি স্টোরে সংরক্ষণ করা হয় । সেই সেশন হ্যান্ডলারটির সাহায্যে সেশন ডেটার বয়সটি ফাইলের শেষ পরিবর্তনের তারিখে এবং শেষ অ্যাক্সেসের তারিখে নয় গণনা করা হয়:

দ্রষ্টব্য: আপনি যদি ডিফল্ট ফাইল-ভিত্তিক সেশন হ্যান্ডলারটি ব্যবহার করে থাকেন তবে আপনার ফাইল সিস্টেমে অবশ্যই অ্যাক্সেসের সময়গুলি (অ্যাটাইম) ট্র্যাক রাখতে হবে। উইন্ডোজ এফএটি তেমন নয় তাই আপনার সেশন সংগ্রহ করার আবর্জনা সামলানোর জন্য আপনাকে অন্য কোনও উপায় নিয়ে আসতে হবে যদি আপনি কোনও এফএটি ফাইল সিস্টেম বা অন্য কোনও ফাইল সিস্টেম যেখানে আটটাইম ট্র্যাকিং উপলব্ধ না থাকে তখন আটকে থাকেন। পিএইচপি ৪.২.৩ থেকে এটি এমটাইমের পরিবর্তে (পরিবর্তিত তারিখ) ব্যবহার করেছে। সুতরাং, টাইম ট্র্যাকিং উপলব্ধ নেই এমন ফাইল সিস্টেমগুলিতে আপনার সমস্যা হবে না।

সুতরাং এটিও ঘটতে পারে যে সেশন ডেটা ফাইল মুছে ফেলা হয়েছে যখন সেশনটি নিজেই এখনও বৈধ হিসাবে বিবেচিত হবে কারণ সেশন ডেটা সম্প্রতি আপডেট হয়নি updated

এবং দ্বিতীয়:

অধিবেশন কুকি_লাইফটাইম
সেশন.কুকি_লাইফটাইম ব্রাউজারে প্রেরণ করা সেকেন্ডের মধ্যে কুকির জীবনকাল নির্দিষ্ট করে specif [...]

হ্যা, তা ঠিক. এটি কেবল কুকি জীবনকালকেই প্রভাবিত করে এবং সেশনটি এখনও বৈধ হতে পারে। তবে ক্লায়েন্ট নয়, একটি সেশনটি অবৈধ করা সার্ভারের কাজ। সুতরাং এটি কিছুই সাহায্য করে না। আসলে, সেশনের কুকি_ লাইফটাইম সেট করার 0ফলে সেশনটির কুকিকে আসল সেশনের কুকি তৈরি করা হবে যা ব্রাউজারটি বন্ধ না হওয়া পর্যন্ত কেবল বৈধ।

উপসংহার / সেরা সমাধান:

সেরা সমাধান হ'ল নিজের একটি সেশন সময়সীমা বাস্তবায়ন। একটি সাধারণ টাইম স্ট্যাম্প ব্যবহার করুন যা শেষ ক্রিয়াকলাপের সময়কে বোঝায় (যেমন অনুরোধ) এবং প্রতিটি অনুরোধের সাথে এটি আপডেট করুন:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

প্রতিটি অনুরোধের সাথে সেশন ডেটা আপডেট করার ফলে সেশন ফাইলের পরিবর্তনের তারিখও পরিবর্তিত হয় যাতে সময়টি আবর্জনা সংগ্রহকারী দ্বারা সেশনটি সরিয়ে না দেওয়া হয়।

অধিবেশন নির্ধারণের মতো সেশনের উপর আক্রমণ এড়াতে আপনি পর্যায়ক্রমে সেশন আইডি পুনরায় তৈরি করতে অতিরিক্ত টাইম স্ট্যাম্প ব্যবহার করতে পারেন :

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

মন্তব্য:

  • session.gc_maxlifetime এই কাস্টম মেয়াদোত্তীর্ণ হ্যান্ডলারের জীবদ্দশায় কমপক্ষে সমান হওয়া উচিত (এই উদাহরণে 1800);
  • যদি আপনি 30 মিনিট পর অধিবেশন মেয়াদ শেষ করতে চান কার্যকলাপ পরিবর্তে 30 মিনিট পরে শুরু থেকে , এছাড়াও আপনি ব্যবহার করতে হবে setcookieএকটি এর মেয়াদ শেষ সঙ্গে time()+60*30অধিবেশন কুকি সক্রিয় রাখা।

3
আপনি যদি "নিষ্ক্রিয় সময়" পরীক্ষা করতে চান তবে আপনি কীভাবে এটি পরিবর্তন করতে পারেন? অন্য কথায়, ব্যবহারকারী লগ ইন করে এবং যতক্ষণ না তারা সাইটটি ব্যবহার করা চালিয়ে যায়, এটি তাদের লগ আউট করে না। তবে যদি তারা 30 মিনিটের জন্য নিষ্ক্রিয় থাকে তবে এটি তাদের লগ আউট করবে?
মহানগর

14
@Metropolis: ভালো কিছু ব্যবহারের $_SESSION['LAST_ACTIVITY']অনুরূপ $_SESSION['CREATED']যেখানে আপনি প্রতি অনুরোধ ব্যবহারকারীর সর্বশেষ কার্যকলাপের সময় কিন্তু আপডেটের যে মান সংরক্ষণ করি। এখনকার সময়ের সাথে বর্তমান সময়ের পার্থক্য যদি 1800 সেকেন্ডের বেশি হয় তবে 30 সেকেন্ডের বেশি সময় সেশনটি ব্যবহার করা হয়নি।
গম্বো

3
@ মেট্রোপলিস: session_unsetএকই কাজ করে $_SESSION = array()
গম্বো

14
@ গম্বো - আইমা কিছুটা বিভ্রান্ত, আপনি কি আপনার কোডটি একত্রিত করে ব্যবহার করতে পারবেন না ini_set('session.gc-maxlifetime', 1800)? অন্যথায় আপনার সেশনটির তথ্যটি আপনার সেশনটি এখনও বৈধ বলে মনে করা হলেও এটি নষ্ট হয়ে যেতে পারে, যদি অন্তত ইনআই সেটিংটি 24 মিনিটের মান হয়। নাকি আমি কিছু মিস করছি?
jeroen

10
@ জেরন: হ্যাঁ, আপনার উচিত। তবে নোট করুন যে সেশন সেভ হ্যান্ডলার ব্যবহার করা থাকলে সেশন . gc_max Lifeটাই ফাইলের শেষ পরিবর্তন তারিখের উপর নির্ভর করে files। সুতরাং সেশন.gc_max Lifetime এই কাস্টম মেয়াদোত্তীর্ণ হ্যান্ডলারের জীবন সময়ের কমপক্ষে সমান হওয়া উচিত।
গাম্বো

135

30 মিনিটের মধ্যে পিএইচপি সেশনের মেয়াদ শেষ হওয়ার সহজ উপায়।

দ্রষ্টব্য: আপনি যদি সময়টি পরিবর্তন করতে চান তবে আপনার পছন্দসই সময় দিয়ে 30 টি পরিবর্তন করুন এবং * 60 পরিবর্তন করবেন না: এটি কয়েক মিনিট সময় দেবে।


মিনিটের মধ্যে: (30 * 60)
দিনগুলিতে: (n * 24 * 60 * 60) n = দিন নয়


login.php

<?php
    session_start();
?>

<html>
    <form name="form1" method="post">
        <table>
            <tr>
                <td>Username</td>
                <td><input type="text" name="text"></td>
            </tr>
            <tr>
                <td>Password</td>
                <td><input type="password" name="pwd"></td>
            </tr>
            <tr>
                <td><input type="submit" value="SignIn" name="submit"></td>
            </tr>
        </table>
    </form>
</html>

<?php
    if (isset($_POST['submit'])) {
        $v1 = "FirstUser";
        $v2 = "MyPassword";
        $v3 = $_POST['text'];
        $v4 = $_POST['pwd'];
        if ($v1 == $v3 && $v2 == $v4) {
            $_SESSION['luser'] = $v1;
            $_SESSION['start'] = time(); // Taking now logged in time.
            // Ending a session in 30 minutes from the starting time.
            $_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
            header('Location: http://localhost/somefolder/homepage.php');
        } else {
            echo "Please enter the username or password again!";
        }
    }
?>

HomePage.php

<?php
    session_start();

    if (!isset($_SESSION['luser'])) {
        echo "Please Login again";
        echo "<a href='http://localhost/somefolder/login.php'>Click Here to Login</a>";
    }
    else {
        $now = time(); // Checking the time now when home page starts.

        if ($now > $_SESSION['expire']) {
            session_destroy();
            echo "Your session has expired! <a href='http://localhost/somefolder/login.php'>Login here</a>";
        }
        else { //Starting this else one [else1]
?>
            <!-- From here all HTML coding can be done -->
            <html>
                Welcome
                <?php
                    echo $_SESSION['luser'];
                    echo "<a href='http://localhost/somefolder/logout.php'>Log out</a>";
                ?>
            </html>
<?php
        }
    }
?>

logout.php

<?php
    session_start();
    session_destroy();
    header('Location: http://localhost/somefolder/login.php');
?>

42
যুক্তি এবং উপস্থাপনা সংমিশ্রণ এমভিসি আদর্শ হয় এই দিন এবং যুগে পরামর্শ দেওয়া হয়।
bcosca

হতে পারে আমি সেশনগুলি সম্পর্কে প্রাথমিক কিছু মিস করছি তবে ওএস দ্বারা প্রতি 30 মিনিটে সেশনগুলি নষ্ট হয়ে গেলে এটি কী করবে?

25
@ স্টিলস্ট্যান্ডিং নিজের পক্ষে কথা বলুন [হাসি] আমি এমভিসিটিকে ঘৃণা হিসাবে দেখি।

2
একক প্রোগ্রামার সহ প্রকল্পটি ছোট হলেও এমভিসি কি ভাল ধারণা? আমার মনে হচ্ছে এমভিসি মডেলটিতে আমার নিজের প্রকল্পগুলি তৈরি করা উচিত (বা সমস্যাটি সমাধান করুন তারপর এটি এমভিসি করুন) তবে এমভিসির সাথে অভিজ্ঞতার অভাবের সাথে এটি কেবল একটি মানসিক ব্লকে পরিণত হয় "আমি কীভাবে এই এমভিসি করব?" এবং সমাধানের জন্য প্রয়োজনীয় প্রাথমিক লক্ষ্য / সমস্যা থেকে একটি বিভ্রান্তি।
মিস্টারভিমস

@ এখনও অন্য উল্লেখের সাথে উল্লেখ করা হচ্ছে যে Login.phpশিরোনামগুলি সামগ্রীর পরে প্রেরণ করা হয়, যা খারাপ।
machineaddict

43

এটি কি কোনও নির্দিষ্ট সময়ের পরে ব্যবহারকারীর লগ আউট করা যায়? এটি নিবন্ধিত হওয়ার পরে সেশন তৈরির সময় (বা একটি সমাপ্তির সময়) সেট করা এবং তারপরে প্রতিটি পৃষ্ঠায় লোড পরীক্ষা করে তা পরিচালনা করতে পারে।

উদাহরণ:

$_SESSION['example'] = array('foo' => 'bar', 'registered' => time());

// later

if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
    unset($_SESSION['example']);
}

সম্পাদনা করুন: আপনার কাছে অন্যরকম কিছু বোঝার মতো অনুভূতি পেয়েছি।

আপনি session.gc_maxlifetimeইনআই সেটিংটি ব্যবহার করে একটি নির্দিষ্ট জীবনকাল পরে সেশনগুলি স্ক্র্যাপ করতে পারেন :

সম্পাদনা: ini_set ('অধিবেশন.gc_max Lifetime', 60 * 30);


1
সেশন.gc- ম্যাক্সলাইফটাইম সম্ভবত যাওয়ার সেরা উপায় best
পাওয়ারলর্ড 13

2
সেশন কুকি জীবনকাল নিয়ে কিছু সমস্যা রয়েছে, উল্লেখযোগ্যভাবে এটি কার্যকর করার জন্য এটি ক্লায়েন্টের উপর নির্ভর করে। কুকি আজীবন ক্লায়েন্টকে অকেজো / মেয়াদোত্তীর্ণ কুকিজ সাফ করার অনুমতি দেয়, এটি কোনও সুরক্ষা সম্পর্কিত কোনও কারণে বিভ্রান্ত হওয়ার দরকার নেই।
জ্যাকো 15'12

এটা gc_maxlifetimeনাকি gc-maxlifetime। এটি কি আন্ডারস্কোর এবং হাইফেন উভয়কেই সমর্থন করে?
মাইক কৌজার

24

এই পোস্টটি অধিবেশন সময়সীমা নিয়ন্ত্রণের বেশ কয়েকটি উপায় দেখায়: http://bytes.com/topic/php/insights/889606-setting-timeout-php-sessions

আইএমএইচও দ্বিতীয় বিকল্পটি একটি দুর্দান্ত সমাধান:

<?php
/***
 * Starts a session with a specific timeout and a specific GC probability.
 * @param int $timeout The number of seconds until it should time out.
 * @param int $probability The probablity, in int percentage, that the garbage 
 *        collection routine will be triggered right now.
 * @param strint $cookie_domain The domain path for the cookie.
 */
function session_start_timeout($timeout=5, $probability=100, $cookie_domain='/') {
    // Set the max lifetime
    ini_set("session.gc_maxlifetime", $timeout);

    // Set the session cookie to timout
    ini_set("session.cookie_lifetime", $timeout);

    // Change the save path. Sessions stored in teh same path
    // all share the same lifetime; the lowest lifetime will be
    // used for all. Therefore, for this to work, the session
    // must be stored in a directory where only sessions sharing
    // it's lifetime are. Best to just dynamically create on.
    $seperator = strstr(strtoupper(substr(PHP_OS, 0, 3)), "WIN") ? "\\" : "/";
    $path = ini_get("session.save_path") . $seperator . "session_" . $timeout . "sec";
    if(!file_exists($path)) {
        if(!mkdir($path, 600)) {
            trigger_error("Failed to create session save path directory '$path'. Check permissions.", E_USER_ERROR);
        }
    }
    ini_set("session.save_path", $path);

    // Set the chance to trigger the garbage collection.
    ini_set("session.gc_probability", $probability);
    ini_set("session.gc_divisor", 100); // Should always be 100

    // Start the session!
    session_start();

    // Renew the time left until this session times out.
    // If you skip this, the session will time out based
    // on the time when it was created, rather than when
    // it was last used.
    if(isset($_COOKIE[session_name()])) {
        setcookie(session_name(), $_COOKIE[session_name()], time() + $timeout, $cookie_domain);
    }
}

19

ঠিক আছে আমি বুঝতে পারছি উপরের উত্তরগুলি সঠিক তবে সেগুলি অ্যাপ্লিকেশন পর্যায়ে রয়েছে, কেন আমরা .htaccessমেয়াদোত্তীর্ণ সময় সেট করতে কেবল ফাইলটি ব্যবহার করি না ?

<IfModule mod_php5.c>
    #Session timeout
    php_value session.cookie_lifetime 1800
    php_value session.gc_maxlifetime 1800
</IfModule>

1
@ লোডের উত্তরটি কেন এই উত্তরটি বিশ্বাসযোগ্য নয় তা সঠিক ব্যাখ্যা দেয়।
এমিক্স

15
if (isSet($_SESSION['started'])){
    if((mktime() - $_SESSION['started'] - 60*30) > 0){
        //Logout, destroy session, etc.
    }
}
else {
    $_SESSION['started'] = mktime();
}

15

এটি session_set_cookie_paramsতৈরি করার জন্য ফানসিটন ব্যবহার করুন।

এই ফাংশন কল করার আগে প্রয়োজনীয় session_start()কল কল করা প্রয়োজনীয়।

এটা চেষ্টা কর:

$lifetime = strtotime('+30 minutes', 0);

session_set_cookie_params($lifetime);

session_start();

আরও দেখুন: http://php.net/manual/function.session-set-cookie-params.php


11

এটি নীচের মত একটি ফাংশন দিয়ে আসলে সহজ। এটি ডাটাবেস টেবিলের নাম 'সেশন' ক্ষেত্রগুলির সাথে 'আইডি' এবং 'সময়' ব্যবহার করে।

প্রতিবার ব্যবহারকারী যখন আপনার সাইট বা পরিষেবাতে আবার যান তখন আপনাকে এই ফাংশনটি জিজ্ঞাসা করতে হবে এটির ফেরতের মান সত্য কিনা তা পরীক্ষা করার জন্য। যদি এটি মিথ্যা হয় তবে ব্যবহারকারীর মেয়াদ শেষ হয়ে গেছে এবং সেশনটি নষ্ট হয়ে যাবে (দ্রষ্টব্য: এই ফাংশনটি ডাটাবেস সংযোগ করতে এবং জিজ্ঞাসা করার জন্য একটি ডাটাবেস ক্লাস ব্যবহার করে, অবশ্যই আপনি এটি আপনার ফাংশন বা এর মতো কিছু করতে পারেন):

function session_timeout_ok() {
    global $db;
    $timeout = SESSION_TIMEOUT; //const, e.g. 6 * 60 for 6 minutes
    $ok = false;
    $session_id = session_id();
    $sql = "SELECT time FROM sessions WHERE session_id = '".$session_id."'";
    $rows = $db->query($sql);
    if ($rows === false) {
        //Timestamp could not be read
        $ok = FALSE;
    }
    else {
        //Timestamp was read succesfully
        if (count($rows) > 0) {
            $zeile = $rows[0];
            $time_past = $zeile['time'];
            if ( $timeout + $time_past < time() ) {
                //Time has expired
                session_destroy();
                $sql = "DELETE FROM sessions WHERE session_id = '" . $session_id . "'";
                $affected = $db -> query($sql);
                $ok = FALSE;
            }
            else {
                //Time is okay
                $ok = TRUE;
                $sql = "UPDATE sessions SET time='" . time() . "' WHERE session_id = '" . $session_id . "'";
                $erg = $db -> query($sql);
                if ($erg == false) {
                    //DB error
                }
            }
        }
        else {
            //Session is new, write it to database table sessions
            $sql = "INSERT INTO sessions(session_id,time) VALUES ('".$session_id."','".time()."')";
            $res = $db->query($sql);
            if ($res === FALSE) {
                //Database error
                $ok = false;
            }
            $ok = true;
        }
        return $ok;
    }
    return $ok;
}

9

সেশনে একটি টাইমস্ট্যাম্প সঞ্চয় করুন


<?php    
$user = $_POST['user_name'];
$pass = $_POST['user_pass'];

require ('db_connection.php');

// Hey, always escape input if necessary!
$result = mysql_query(sprintf("SELECT * FROM accounts WHERE user_Name='%s' AND user_Pass='%s'", mysql_real_escape_string($user), mysql_real_escape_string($pass));

if( mysql_num_rows( $result ) > 0)
{
    $array = mysql_fetch_assoc($result);    

    session_start();
    $_SESSION['user_id'] = $user;
    $_SESSION['login_time'] = time();
    header("Location:loggedin.php");            
}
else
{
    header("Location:login.php");
}
?>

এখন, টাইমস্ট্যাম্প অনুমোদিত সময় উইন্ডোর মধ্যে রয়েছে কিনা তা পরীক্ষা করুন (1800 সেকেন্ড 30 মিনিট)

<?php
session_start();
if( !isset( $_SESSION['user_id'] ) || time() - $_SESSION['login_time'] > 1800)
{
    header("Location:login.php");
}
else
{
    // uncomment the next line to refresh the session, so it will expire after thirteen minutes of inactivity, and not thirteen minutes after login
    //$_SESSION['login_time'] = time();
    echo ( "this session is ". $_SESSION['user_id'] );
    //show rest of the page and all other content
}
?>

8

দয়া করে আপনার অন্তর্ভুক্ত ফাইলটিতে কোডের নিম্নলিখিত ব্লকটি ব্যবহার করুন যা প্রতিটি পৃষ্ঠায় লোড হয়।

$expiry = 1800 ;//session expiry required after 30 mins
    if (isset($_SESSION['LAST']) && (time() - $_SESSION['LAST'] > $expiry)) {
        session_unset();
        session_destroy();
    }
    $_SESSION['LAST'] = time();

1

এই ক্লাসটি 30 মিনিটের জন্য ব্যবহার করুন

class Session{
    public static function init(){
        ini_set('session.gc_maxlifetime', 1800) ;
        session_start();
    }
    public static function set($key, $val){
        $_SESSION[$key] =$val;
    }
    public static function get($key){
        if(isset($_SESSION[$key])){
            return $_SESSION[$key];
        } else{
            return false;
        }
    }
    public static function checkSession(){
        self::init();
        if(self::get("adminlogin")==false){
            self::destroy();
            header("Location:login.php");
        }
    }
    public static function checkLogin(){
        self::init();
        if(self::get("adminlogin")==true){
            header("Location:index.php");
        }
    }
    public static function destroy(){
        session_destroy();
        header("Location:login.php");
    }
}

0

টাইমস্ট্যাম্প ব্যবহার করে ...

<?php
if (!isset($_SESSION)) {
    $session = session_start();
} 
if ($session && !isset($_SESSION['login_time'])) {
    if ($session == 1) {
        $_SESSION['login_time']=time();
        echo "Login :".$_SESSION['login_time'];
        echo "<br>";
        $_SESSION['idle_time']=$_SESSION['login_time']+20;
        echo "Session Idle :".$_SESSION['idle_time'];
        echo "<br>";
    } else{
        $_SESSION['login_time']="";
    }
} else {
    if (time()>$_SESSION['idle_time']){
        echo "Session Idle :".$_SESSION['idle_time'];
        echo "<br>";
        echo "Current :".time();
        echo "<br>";
        echo "Session Time Out";
        session_destroy();
        session_unset();
    } else {
        echo "Logged In<br>";
    }
}
?>

টাইমস্ট্যাম্প ব্যবহার করে সেশনটির মেয়াদ শেষ করতে আমি 20 সেকেন্ড ব্যবহার করেছি

আপনার যদি 30 মিনিটের প্রয়োজন হয় 1800 (সেকেন্ডে 30 মিনিট) যোগ করুন ...


0

বিকল্প হিসাবে এটি করতে আপনি সরাসরি ডিবি ব্যবহার করতে পারেন। আমি chk_lgn বলি এটি করতে আমি একটি ডিবি ফাংশন ব্যবহার করি।

তারা লগ ইন করেছে কিনা তা লগইন চেকগুলি পরীক্ষা করে দেখুন এবং এটি করে এটি ব্যবহারকারীর ডিবি সারি / কলামে সর্বশেষ সক্রিয় হিসাবে চেকটির তারিখের সময়টিকিট নির্ধারণ করে।

আমি সেখানে সময় চেক করি। আমি প্রতিটি পৃষ্ঠার জন্য এই ফাংশনটি ব্যবহার করি কারণ মুহূর্তের জন্য এটি আমার জন্য কাজ করে।

PS আমি দেখেছি এমন কেউই খাঁটি ডিবি সমাধানের পরামর্শ দেয়নি।


0

পিএইচপি কীভাবে সেশনগুলি পরিচালনা করে তা শুরুর জন্য বিগুরুত্বপূর্ণ is এটি কীভাবে সেশনগুলি কাজ করে তার একটি ওভারভিউ দিয়ে তাদের সহায়তা করতে পারে: সেশনগুলি কীভাবে কাজ করে (কাস্টম-সেশন-হ্যান্ডলারগুলি)


-1

কেবলমাত্র বর্তমান সময়টি সংরক্ষণ করুন এবং যদি এটি তুলনা করে 30 মিনিটের বেশি হয় তবে বর্তমান সেশনটি ধ্বংস করুন।


সেশনটি ব্যবহার করার সময় আপনি যখন একবার মূল্যায়ন করেছিলেন, তাই না?
এরিক ক্রামার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.