পিএইচপি সেশন ইতিমধ্যে শুরু হয়েছে কিনা তা পরীক্ষা করুন


461

আমার একটি পিএইচপি ফাইল রয়েছে যা কখনও কখনও সেশন শুরু করা পৃষ্ঠা এবং কখনও কখনও সেশন শুরু না করে এমন একটি পৃষ্ঠা থেকে কল করা হয়। সুতরাং আমি যখন session_start()এই স্ক্রিপ্টটিতে থাকি তখন মাঝে মাঝে "সেশন ইতিমধ্যে শুরু" এর ত্রুটি বার্তাটি পাই get তার জন্য আমি এই লাইনগুলি রেখেছি:

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

তবে এবার আমি এই সতর্কতা বার্তাটি পেয়েছি:

বিজ্ঞপ্তি: অপরিজ্ঞাপিত পরিবর্তনশীল: _SESSION

অধিবেশন ইতিমধ্যে শুরু হয়েছে কিনা তা পরীক্ষা করার আরও ভাল উপায় আছে কি?

আমি @session_startযদি এটি ব্যবহার করি তবে এটি কি জিনিসগুলিকে সঠিকভাবে কাজ করবে এবং কেবল সতর্কতা বন্ধ করে দেবে?



আরও দেখুন Stackoverflow এই উত্তর: stackoverflow.com/questions/1545357/...
যোগাযোগ-form.co_you_go

উত্তর:


761

পিএইচপি> = 5.4.0, পিএইচপি 7 এর সংস্করণগুলির জন্য প্রস্তাবিত উপায়

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

তথ্যসূত্র: http://www.php.net/manual/en/function.session-status.php

পিএইচপি <5.4.0 সংস্করণের জন্য

if(session_id() == '') {
    session_start();
}

1
আমি মনে করি পিএইচপি <5.4 এর সমাধানে কোনও সমস্যা আছে। সেশন_আইডি সেট করা হয় প্রথম টাইম সেশন শুরু হয়, তবে সেশনটি বন্ধ হয়ে গেলে তা মুছে ফেলা হয় না। সুতরাং উদাহরণস্বরূপ, যদি আপনার স্নিপেটের আগে, এর মতো কোড থাকে session_start();session_write_close();: তবে যদি শর্তটি ব্যর্থ হয় তবে আমাদের কোনও খোলা অধিবেশন নেই ...
নিকোলো মার্টিনি

@ নিকোলো মার্টিনি যেমনটি আমি বুঝতে পেরেছি: session_start()স্ক্রিপ্টের শীর্ষে একটি সেশন শুরু হয় যখন স্ক্রিপ্টটি প্রস্থান হয়, বা কখন session_write_closed()স্ক্রিপ্টটি প্রস্থান করার আগে ডাকা হয়। অর্থাত সেশন কুকিতে যখন এটি ডেটা লেখা হয় এবং সেশনটি অন্য স্ক্রিপ্ট দ্বারা অ্যাক্সেসের জন্য আনলক করা হয় যা 'সেশন_স্টার্ট' নামেও ডায়াল করে থাকে a বন্ধ হওয়ার অর্থ এই নয় যে অধিবেশনটি হ্রাস পেয়েছে। আপনি বর্তমান স্ক্রিপ্ট থেকে বের হয়ে বা কল করে একটি সেশন বন্ধ session_write_close()করতে পারেন এবং কল করে আপনি এটি আবার খুলতে পারেন session_start()। আমার বোঝাপড়া, অন্তত।
স্টেফান

1
সেশন শুরু করার জন্য এটি কি এখনও ভাল উপায়? কারণ লিঙ্কটিতে এই উত্তরটির সাথে সম্পর্কিত কিছুই নেই
csandreas1

@ csandreas1 আপনি সেশন_স্ট্যাটাসের বিবরণ এবং এর প্রত্যাশিত প্রত্যাবর্তনের মানগুলি লিঙ্ক থেকে দেখতে পাবেন। আপনার প্রশ্নের উত্তর হ্যাঁ!
lovelyramos

আমি কিছু পরিস্থিতিতে এটি ব্যর্থ হয়েছি - আমি যদি (! Isset ($ _ SESSION)) সাফল্যের সাথে ব্যবহার করেছি
স্কট

161

পিএইচপি 5.4.0 এর আগে পিএইচপি সংস্করণগুলির জন্য:

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

যদিও, আইএমএইচও, আপনার সেশন ম্যানেজমেন্ট কোডটি রিফ্যাক্ট করার বিষয়ে সত্যই চিন্তা করা উচিত যদি আপনি জানেন না যে সেশন শুরু হয় কি না ...

এটি বলেছিল, আমার মতামত বিষয়গত, এবং এমন পরিস্থিতি রয়েছে (যার উদাহরণ নীচে দেওয়া মন্তব্যে বর্ণিত) যেখানে সেশন শুরু হয়েছে তা জানা সম্ভব নাও হতে পারে।


37
আপনার সেশনটি শুরু হয়েছে কিনা তা জানা অবধারিতভাবে খারাপ নয়। যদি আপনি অলস-লোডিং হয় (তবে প্রথম সেশনটি শুরু করার আগে কেবল এটি শুরু করা হয়) তবে আপনার উত্তরের পরীক্ষাটি ঠিকঠাক হবে।
ড্রুম

1
এছাড়াও কিছু পরিবেশে
অ্যাপাচে


3
রেফ্যাক্টরিং সেশন ম্যানেজমেন্ট সম্পর্কে মন্তব্য যদি আপনি জানেন না যে এটি নির্ধারিত হয়েছে কি না তবে এটি সত্যিই প্রাসঙ্গিক নয়। উদাহরণস্বরূপ, যদি ওয়ার্ডপ্রেস থিমে উন্নত বৈশিষ্ট্যগুলি কোডিং করা হয় তবে কোনও প্লাগইন ইতিমধ্যে চেক না করে সেশন ব্যবহার শুরু করেছে কিনা তা আপনি কখনই জানতে পারবেন না। কোডিং দুনিয়া সবসময় যে কালো এবং সাদা হয় না: পি
জিম্বো জনি

মিম, সত্যিই ভাল পয়েন্ট। আমি স্বীকার করি যে আমার মন্তব্যগুলি খুব সাবজেক্টিভ - আমি এটির প্রতিফলন করতে আমার উত্তরটি সংশোধন করব।
অ্যালেক্স

71

পিএইচপি 5.4 সেশন_স্ট্যাটাস () প্রবর্তন করেছে , যা নির্ভর করার চেয়ে বেশি নির্ভরযোগ্য session_id()

নিম্নলিখিত স্নিপেট বিবেচনা করুন:

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

সুতরাং, কোনও সেশন শুরু হয়েছে কিনা তা পরীক্ষা করতে, পিএইচপি 5.4-এ প্রস্তাবিত উপায়টি এখন:

session_status() == PHP_SESSION_ACTIVE

3
কোডের স্নিপেট যা সেশন_স্ট্যাটাস ব্যবহার করে যখন উপলব্ধ থাকে এবং পুরানো পদ্ধতিগুলি এখানে নিখুঁত বলে মনে হয় না বিটিডাব্লু, ইঙ্গিতটি :)
জিম্বো জনি

1
বেনিয়ামিন আপডেটের জন্য আপনাকে ধন্যবাদ। এটি জেনে রাখা ভাল যে পিএইচপি 5.4 হিসাবে একটি নতুন পদ্ধতি ব্যবহার করা যেতে পারে।
লোগান

1
এটি যাচাইয়ের এটি আরও ভাল উপায়, আপনি সবসময় জানেন না যে আপনার কোনও সেশন শুরু হয়েছে কিনা বিশেষত যখন ব্যবহারকারী কুকিগুলি সাইট ব্রাউজিংয়ের মাঝামাঝি সময়ে সাফ করেন তখন ... আমি সর্বদা 2 বছরের বাচ্চাদের কোড করি, আপনি ব্যবহারকারীরা কি করতে যাচ্ছেন তা কখনই জানেন না ;-) আমার নিজের কাছে একটি ছোট কনফিগারেশন ফাইল রয়েছে যা আমার সমস্ত স্ক্রিপ্টগুলিতে সেটআপ ভেরিয়েবল এবং অন্যান্য তথ্যতে ডাকা হয় তাই কেবল এই ফাইলটিতে এটি যুক্ত করা সর্বদা নিশ্চিত করে যে সেশনটি শুরু হয়েছে কিনা এটি প্রয়োজন
অ্যান্ডি ব্রাহাম

35

আপনি এটি করতে পারেন, এবং এটি সত্যিই সহজ।

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

আশা করি এটা সাহায্য করবে :)


6
@Zloctb: আমি যে পরিস্থিতি করব তা নিয়ে আমি ভাবতে পারি না $_SESSION=array();, সুতরাং এই উত্তরটি ঠিক আছে বলে মনে হচ্ছে।
অর্ধেক

5
@ হ্যাফার রায়ান এর উত্তর দেখুন। যদি session_destroy()ডাকা হয় তবে $_SESSIONএখনও সেট করা যেতে পারে। এছাড়াও, ইউনিট পরীক্ষায় আপনি $_SESSIONসরাসরি সেট করতে পারেন । তবে আমি এটিকে অগ্রাহ্য করেছি, কারণ বেশিরভাগ ব্যবহারিক পরিস্থিতিতে এই উত্তরটি যথেষ্ট ভাল হওয়া উচিত (পিএইচপি 5.3 অবধি আর কখনও দেখা যায় না ...)
ড্যারেন কুক

22
if (version_compare(phpversion(), '5.4.0', '<')) {
     if(session_id() == '') {
        session_start();
     }
 }
 else
 {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
 }

21

পিএইচপি 5.4 এর আগে বৈশ্বিক পতাকা নির্ধারণ করা ছাড়া অন্য জানার কোনও নির্ভরযোগ্য উপায় নেই।

বিবেচনা:

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

বা:

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.

সুতরাং, পিএইচপি 5.4 এর আগে আপনার একটি গ্লোবাল বুলিয়ান সেট করা উচিত।


12

সমস্ত পিএইচপি সংস্করণ জন্য

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

1
একইভাবে, if ((defined('PHP_SESSION_ACTIVE') && session_status() !== PHP_SESSION_ACTIVE) || !session_id())
কেউও

9

এটা যাচাই কর :

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

সূত্র http://php.net




5

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

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

আপনার একমাত্র জিনিসটি করা দরকার:

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

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

একই প্রতিক্রিয়া উপরে রয়েছে (@ মমিউরু)

2

এই জাতীয় সমাধানের দক্ষতা সম্পর্কে নিশ্চিত নয়, তবে এটি কার্যনির্বাহী প্রকল্প থেকে এটি যদি আপনার ডিফল্ট ভাষা সংজ্ঞায়িত করতে হয় তবে এটিও ব্যবহৃত হয়

   /**
    * 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

@ একটি ফাংশন কল ফাংশন কল চলাকালীন রিপোর্ট করা হতে পারে যে কোনও ত্রুটি দমন আগে।

@আগে যোগ করা হচ্ছেsession_start পিএইচপি কে ত্রুটি বার্তাগুলির মুদ্রণ এড়াতে বলে।

উদাহরণ স্বরূপ:

session_start()আপনি ইতিমধ্যে ব্রাউজারে কিছু মুদ্রণের পরে ব্যবহার করার ফলে একটি ত্রুটির ফলস্বরূপ পিএইচপি এমন কিছু প্রদর্শন করবে যা "শিরোনামগুলি প্রেরণ করা যায় না: (লাইন 12)" এ শুরু হয়েছিল,@session_start() হবে, তবুও এই ক্ষেত্রে ত্রুটি বার্তা মুদ্রিত হয়নি পর্দা।

ফাইলগুলি অন্তর্ভুক্ত করার আগে বা নতুন পৃষ্ঠায় পুনঃনির্দেশের আগে এটি ব্যবহার করুন exit() ফাংশনটি , অন্যথায় এটি একটি ত্রুটি দেয়।

এই কোডটি সব ক্ষেত্রেই ব্যবহার করা যেতে পারে:


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

1

পিএইচপি 5.3 এ এটি আমার জন্য কাজ করে:

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

তাহলে তোমার আছে। আপনি যদি নোট না রাখেন তবে সেশন শুরু হওয়া বিবৃতিটি কোনওভাবেই শুরু হবে কেন আমি তা করি না।


1

@ মেলিজা রামোস রেসপন্স (প্রথম প্রতিক্রিয়া দেখুন) এবং http://php.net/manual/en/function.phpversion.php , ভিত্তিতে প্রতিক্রিয়া

ক্রিয়া:

  • যদি না থাকে তবে PHP_VERSION_ID সংজ্ঞা দিন
  • PHP_VERSION_ID এর উপর ভিত্তি করে সংস্করণটি পরীক্ষা করতে ফাংশনটি সংজ্ঞায়িত করুন
  • ওপেনসেশন () সুরক্ষিত করতে ফাংশন সংজ্ঞায়িত করুন

শুধুমাত্র ওপেনসেশন ব্যবহার করুন ()

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

প্রকৃতপক্ষে, এটি সমাধান হয়ে যাওয়ার কারণেই এখানে এটি ব্যাখ্যা করতে এখন অনেক দেরি হয়ে গেছে। এটি আমার প্রকল্পের একটি .inc ফাইল ছিল যেখানে আপনি একটি থালা নির্বাচন করে কোনও রেস্তোঁরা জন্য মেনু কনফিগার করেন এবং সরিয়ে / যুক্ত বা অর্ডার পরিবর্তন করে। আমি যে সার্ভারে কাজ করছিলাম তার প্রকৃত সংস্করণ ছিল না তাই আমি এটিকে আরও নমনীয় করে তুললাম। এটি লেখকরা ব্যবহার করতে এবং এটি ব্যবহার করে দেখতে ইচ্ছুক।


1

এই কোড স্নিপেট আপনার জন্য কাজ করে?

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

0

আপনার কোডটি পুনর্গঠিত করা উচিত যাতে আপনি session_start()প্রতি পৃষ্ঠাগুলি কার্যকরভাবে একবার কল করেন ।


4
পৃষ্ঠা প্রয়োগের জন্য ঠিক একবারে এটি কল করা কিছু পরিস্থিতিতে পছন্দসই নয়।
টিমো হুভিনেন

যদি আপনি এটিটি পুনরায় তৈরি করতে সেশনটি হত্যা করছেন, তবে নিশ্চিত, তবে এটি একটি বিশেষ ক্ষেত্রে। সাধারণভাবে, আবেদনের এমন কোড থাকা উচিত যা একবারের শুরুতে একবার চালানো হয়, যা সেশন_স্টার্ট () যায়)
স্যামটি

1
উদাহরণস্বরূপ, একটি অ্যাপ্লিকেশন একটি ফাইলে সেশনগুলি সঞ্চয় করে এবং এতে ডেটাগুলির 2 সহবর্তী ধীর অনুরোধগুলি লোড করা দরকার, এই অনুরোধগুলির কোনওটিরই সেশনের প্রয়োজন নেই, তবে একটি অপরটি ব্লক করবে কারণ সেশন_স্টার্টটি সেশন ফাইলটিকে লক করে।
টিমো হুভিনেন

যথাযথভাবে। @ ইউরিকলোভস্কি ঠিক আছে অ্যালেক্সের প্রশ্ন প্রাসঙ্গিক কারণ এই মামলাগুলি ঘটতে পারে, এবং এগুলি অস্বাভাবিক নয়।
পাওলো কোঘি - মনিকা

14
-1, বেশিরভাগ ওয়েবসাইটগুলি সিএমএস চালিত এবং থিম এবং প্লাগইনগুলির মতো জিনিস থাকে, প্রায়শই বিভিন্ন পক্ষের দ্বারা লিখিত হয়, একে অপরের কোডটি সেশনগুলি শুরু হয়েছে কিনা তা কখনই জানে না। এই ইঙ্গিতটি যে কোনও কোড সংস্থার সমস্যা এটি কেবল একটি মিথ্যা।
জিম্বো জনি


0

PHP_VERSION_ID পিএইচপি 5.2.7 হিসাবে উপলব্ধ, তাই প্রথমে এটি পরীক্ষা করুন এবং যদি প্রয়োজন হয় তবে এটি তৈরি করুন। session_statusপিএইচপি 5.4 হিসাবে উপলব্ধ, তাই আমাদের এটিও পরীক্ষা করতে হবে:

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

আমার অনুশীলনের উপর ভিত্তি করে, অ্যাক্সেস করার আগে $_SESSION[]আপনাকে session_startস্ক্রিপ্টটি ব্যবহার করার জন্য প্রতিবার কল করতে হবে। ম্যানুয়াল জন্য নীচের লিঙ্কটি দেখুন।

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

আমার পক্ষে কমপক্ষে session_startএকটি নাম হিসাবে বিভ্রান্তিকর। এ session_loadআরও পরিষ্কার হতে পারে।


0

আমি স্থিতির ডাবল চেক দিয়ে শেষ। পিএইচপি 5.4+

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

0

পিএইচপি সেশন ইতিমধ্যে শুরু হয়েছে কিনা তা পরীক্ষা করতে আপনি নিম্নলিখিত সমাধানটি ব্যবহার করতে পারেন:

if(session_id()== '')
{
   echo"Session isn't Start";
}
else
{
    echo"Session Started";
}

বৈধ উত্তরটি আরও বিশদ।
ক্লিমেট প্রেভস্ট

0

এটি একটি সেশন শুরু হয়েছে কিনা তা নির্ধারণ করতে আমি এটি ব্যবহার করি। খালি এবং আইসেটটি নিম্নরূপ ব্যবহার করে:

if (empty($_SESSION)  && !isset($_SESSION))  {
    session_start();
}

-3

এর সাথে প্রতিস্থাপন করুন session_start();:

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

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