• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • session_start()

    (PHP 4, PHP 5, PHP 7)

    启动新会话或者重用现有会话

    说明

    session_start([array $options= array()]): bool

    session_start()会创建新会话或者重用现有会话。如果通过 GET 或者 POST 方式,或者使用 cookie 提交了会话 ID,则会重用现有会话。

    当会话自动开始或者通过session_start()手动开始的时候, PHP 内部会调用会话管理器的 open 和 read 回调函数。会话管理器可能是 PHP 默认的,也可能是扩展提供的(SQLite 或者 Memcached 扩展),也可能是通过session_set_save_handler()设定的用户自定义会话管理器。通过 read 回调函数返回的现有会话数据(使用特殊的序列化格式存储), PHP 会自动反序列化数据并且填充$_SESSION 超级全局变量。

    要想使用命名会话,请在调用session_start()函数之前调用session_name()函数。

    如果启用了session.use_trans_sid选项,session_start()函数会注册一个内部输出管理器,该输出管理器完成 URL 重写的工作。

    如果用户联合使用ob_start()和ob_gzhandler函数,那么函数的调用顺序会影响输出结果。例如,必须在开始会话之前调用ob_gzhandler函数完成注册。

    参数

    $options

    此参数是一个关联数组,如果提供,那么会用其中的项目覆盖会话配置指示中的配置项。此数组中的键无需包含session.前缀。

    除了常规的会话配置指示项,还可以在此数组中包含read_and_close选项。如果将此选项的值设置为TRUE,那么会话文件会在读取完毕之后马上关闭,因此,可以在会话数据没有变动的时候,避免不必要的文件锁。

    返回值

    成功开始会话返回TRUE,反之返回FALSE

    更新日志

    版本说明
    7.1.0session_start()执行失败,无法开始一个会话的时候,会返回FALSE,并且不会初始化超级变量$_SESSION
    7.0.0新加$options参数。
    5.3.0如果函数调用失败返回FALSE,之前版本返回了TRUE

    范例

    基本的会话示例

    Example #1page1.php

    <?php
    // page1.php
    session_start();
    echo 'Welcome to page #1';
    $_SESSION['favcolor'] = 'green';
    $_SESSION['animal']   = 'cat';
    $_SESSION['time']     = time();
    // 如果使用 cookie 方式传送会话 ID
    echo '<br /><a href="page2.php">page 2</a>';
    // 如果不是使用 cookie 方式传送会话 ID,则使用 URL 改写的方式传送会话 ID
    echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
    ?>
    

    请求page1.php页面之后,第二个页面page2.php会包含会话数据。请查阅会话参考获取更多关于会话 ID 传送的信息,在该参考页面中有关于常量SID的详细说明。

    Example #2page2.php

    <?php
    // page2.php
    session_start();
    echo 'Welcome to page #2<br />';
    echo $_SESSION['favcolor']; // green
    echo $_SESSION['animal'];   // cat
    echo date('Y m d H:i:s', $_SESSION['time']);
    // 类似 page1.php 中的代码,你可能需要在这里处理使用 SID 的场景
    echo '<br /><a href="page1.php">page 1</a>';
    ?>
    

    调用session_start()的时候指定选项

    覆盖 Cookie 超时时间设定

    <?php
    // 设置 cookie 的有效时间为 1 天
    session_start([
        'cookie_lifetime' => 86400,
    ]);
    ?>
    

    读取会话之后立即关闭会话存储文件

    <?php
    // 如果确定不修改会话中的数据,
    // 我们可以在会话文件读取完毕之后立即关闭它
    // 来避免由于给会话文件加锁导致其他页面阻塞
    session_start([
        'cookie_lifetime' => 86400,
        'read_and_close'  => true,
    ]);

    注释

    Note:

    要使用基于 cookie 的会话,必须在输出开始之前调用session_start()函数。

    Note:

    建议使用zlib.output_compression来替代ob_gzhandler()。

    Note:

    根据配置不同,本函数会发送几个 HTTP 响应头。参考session_cache_limiter()来自定义 HTTP 响应头。

    参见

    • $_SESSION
    • session.auto_start配置指示
    • session_id() 获取/设置当前会话 ID
    If you want to handle sessions with a class, I wrote this little class:
    <?php
    /*
      Use the static method getInstance to get the object.
    */
    class Session
    {
      const SESSION_STARTED = TRUE;
      const SESSION_NOT_STARTED = FALSE;
      
      // The state of the session
      private $sessionState = self::SESSION_NOT_STARTED;
      
      // THE only instance of the class
      private static $instance;
      
      
      private function __construct() {}
      
      
      /**
      *  Returns THE instance of 'Session'.
      *  The session is automatically initialized if it wasn't.
      *  
      *  @return  object
      **/
      
      public static function getInstance()
      {
        if ( !isset(self::$instance))
        {
          self::$instance = new self;
        }
        
        self::$instance->startSession();
        
        return self::$instance;
      }
      
      
      /**
      *  (Re)starts the session.
      *  
      *  @return  bool  TRUE if the session has been initialized, else FALSE.
      **/
      
      public function startSession()
      {
        if ( $this->sessionState == self::SESSION_NOT_STARTED )
        {
          $this->sessionState = session_start();
        }
        
        return $this->sessionState;
      }
      
      
      /**
      *  Stores datas in the session.
      *  Example: $instance->foo = 'bar';
      *  
      *  @param  name  Name of the datas.
      *  @param  value  Your datas.
      *  @return  void
      **/
      
      public function __set( $name , $value )
      {
        $_SESSION[$name] = $value;
      }
      
      
      /**
      *  Gets datas from the session.
      *  Example: echo $instance->foo;
      *  
      *  @param  name  Name of the datas to get.
      *  @return  mixed  Datas stored in session.
      **/
      
      public function __get( $name )
      {
        if ( isset($_SESSION[$name]))
        {
          return $_SESSION[$name];
        }
      }
      
      
      public function __isset( $name )
      {
        return isset($_SESSION[$name]);
      }
      
      
      public function __unset( $name )
      {
        unset( $_SESSION[$name] );
      }
      
      
      /**
      *  Destroys the current session.
      *  
      *  @return  bool  TRUE is session has been deleted, else FALSE.
      **/
      
      public function destroy()
      {
        if ( $this->sessionState == self::SESSION_STARTED )
        {
          $this->sessionState = !session_destroy();
          unset( $_SESSION );
          
          return !$this->sessionState;
        }
        
        return FALSE;
      }
    }
    /*
      Examples:
    */
    // We get the instance
    $data = Session::getInstance();
    // Let's store datas in the session
    $data->nickname = 'Someone';
    $data->age = 18;
    // Let's display datas
    printf( '<p>My name is %s and I\'m %d years old.</p>' , $data->nickname , $data->age );
    /*
      It will display:
      
      Array
      (
        [nickname] => Someone
        [age] => 18
      )
    */
    printf( '<pre>%s</pre>' , print_r( $_SESSION , TRUE ));
    // TRUE
    var_dump( isset( $data->nickname ));
    // We destroy the session
    $data->destroy();
    // FALSE
    var_dump( isset( $data->nickname ));
    ?>
    I prefer using this class instead of using directly the array $_SESSION.
    As others have noted, PHP's session handler is blocking. When one of your scripts calls session_start(), any other script that also calls session_start() with the same session ID will sleep until the first script closes the session.
    A common workaround to this is call session_start() and session_write_close() each time you want to update the session.
    The problem with this, is that each time you call session_start(), PHP prints a duplicate copy of the session cookie to the HTTP response header. Do this enough times (as you might do in a long-running script), and the response header can get so large that it causes web servers & browsers to crash or reject your response as malformed.
    This error has been reported to PHP HQ, but they've marked it "Won't fix" because they say you're not supposed to open and close the session during a single script like this. https://bugs.php.net/bug.php?id=31455
    As a workaround, I've written a function that uses headers_list() and header_remove() to clear out the duplicate cookies. It's interesting to note that even on requests when PHP sends duplicate session cookies, headers_list() still only lists one copy of the session cookie. Nonetheless, calling header_remove() removes all the duplicate copies.
    <?php
    /**
     * Every time you call session_start(), PHP adds another
     * identical session cookie to the response header. Do this
     * enough times, and your response header becomes big enough
     * to choke the web server.
     *
     * This method clears out the duplicate session cookies. You can
     * call it after each time you've called session_start(), or call it
     * just before you send your headers.
     */
    function clear_duplicate_cookies() {
      // If headers have already been sent, there's nothing we can do
      if (headers_sent()) {
        return;
      }
      $cookies = array();
      foreach (headers_list() as $header) {
        // Identify cookie headers
        if (strpos($header, 'Set-Cookie:') === 0) {
          $cookies[] = $header;
        }
      }
      // Removes all cookie headers, including duplicates
      header_remove('Set-Cookie');
      // Restore one copy of each cookie
      foreach(array_unique($cookies) as $cookie) {
        header($cookie, false);
      }
    }
    ?>
    
    The constant SID would always be '' (an empty string) if directive session.use_trans_sid in php ini file is set to 0. 
    So remember to set session.use_trans_sid to 1 and restart your server before you use SID in your php script.
    If you open a popup window (please no commercial ones!) with javascript window.open it might happen IE blocks the session cookie.
    A simple fix for that is opening the new window with the session ID in a GET value. Note I don't use SID for this, because it will not allways be available.
    ----page.php----
    //you must have a session active here
    window.open('popup.php?sid=<?php echo session_id(); ?>', '700x500', 'toolbar=no, status=no, scrollbars=yes, location=no, menubar=no, directories=no, width=700, height=500');
    ----popup.php----
    <?php
    session_id(strip_tags($_GET['sid']));
    session_start();
    //and go on with your session vars
    ?>
    
    Unfortunately, after pulling my hair out trying to figure out why my application was working fine in every browser other than IE ( Internet Explorer) (Opera, Chrome, Firefox, Safari are what I've tested this in) - when using a DNS CNAME record (like a vanity name that is different from the DNS A record, which is the hostname of the server) sessions do not work correctly.
    If you store a session var while on the CNAME:
    vanity.example.com and the hostname of the server is hosname.example.com
    Then try to call the variable from a different page, it will not find it because of the CNAME (I guess it store the variable under the hostname, then when trying to read it it's still looking under the CNAME) the same application works fine when accessing it under the hostname directly. Keep in mind that I was testing this on an internal network.
    I recently made an interesting observation:
    It seems that `session_start()` can return `true` even if the session was not properly created. In my case, the disk storage was full and so the session data could not be written to disk. I had some logic that resulted in an infinite loop when the session was not written to disk.
    To check if the session really was saved to disk I used:
    ```
    <?php
    function safe_session_start() {
      # Attempt to start a session
      if (!@\session_start()) return false;
      #
      # Check if we need to perform
      # the write test.
      #
      if (!isset($_SESSION['__validated'])) {
        $_SESSION['__validated'] = 1;
        # Attempt to write session to disk
        @\session_write_close();
        # Unset the variable from memory.
        # This step may be unnecessary
        unset($_SESSION['__validated']);
        # Re-start session
        @\session_start();
        # Check if variable value is retained
        if (!isset($_SESSION['__validated'])) {
          # Session was not written to disk
          return false;
        }
      }
      return true;
    }
    if (!safe_session_start()) {
      # Sessions are probably not written to disk...
      # Handle error accordingly.
    }
    ?>
    ```
    Took me quite a while to figure this out. 
    Maybe it helps someone!
    PHP locks the session file until it is closed. If you have 2 scripts using the same session (i.e. from the same user) then the 2nd script will not finish its call to session_start() until the first script finishes execution.
    If you have scripts that run for more than a second and users may be making more than 1 request at a time then it is worth calling session_write_close() as soon as you've finished writing session data.
    <?php
    // a lock is places on the session, so other scripts will have to wait
    session_start();
    // do all your writing to $_SESSION
    $_SESSION['a'] = 1;
    // $_SESSION can still be read, but writing will not update the session.
    // the lock is removed and other scripts can now read the session
    session_write_close();
    do_something_slow();
    ?>
    Found this out from http://konrness.com/php5/how-to-prevent-blocking-php-requests/
    A session created with session_start will only be available to pages within the directory tree of the page that first created it.
    i.e. If the page that first creates the session is /dir1/dir2/index.php and the user then goes to any page above dir2 (e.g. /dir1/index.php), session_start will create a new session rather than use the existing one.
    X Maintainers ... Sorry to be such pain the ass, please delete this duplicate, because submitted in a crazy 'session' where i've mess things between browser tabs ... sorry again, alessio
    http://php.net/manual/en/function.session-start.php#121310
    If you are using a custom session handler via session_set_save_handler() then calling session_start() in PHP 7.1 you might see an error like this:
    session_start(): Failed to read session data: user (path: /var/lib/php/session) in ...
    As of this writing, it seems to be happening in PHP 7.1, and things look OK in PHP7.0. 
    It is also hard to track down because if a session already exists for this id (maybe created by an earlier version of PHP), it will not trigger this issue because the $session_data will not be null.
    The fix is simple... you just need to check for 'null' during your read function:
    <?php
    function read($id)
    {
     //... pull the data out of the DB, off the disk, memcache, etc
     $session_data = getSessionDataFromSomewhere($id);
     
     //check to see if $session_data is null before returning (CRITICAL)
     if(is_null($session_data))
     {
      $session_data = ''; //use empty string instead of null!
     }
     return $session_data;
    }
    ?>
    
    PHP Manual specifically denotes this common mistake:
    Depending on the session handler, not all characters are allowed within the session id. For example, the file session handler only allows characters in the range a-z A-Z 0-9 , (comma) and - (minus)!
    See session_id() manual page for more details.
    3 easy but vital things about Sessions in AJAX Apps.
    <?php
    // session start
    // It is VERY important to include a Period if using
    // a whole domain. (.yourdomain.com)
    // It is VERY important to set the root path your session will always
    // operate in... (/members) will ensure sessions will NOT be interfered
    // with a session with a path of say (/admin) ... so you can log in
    // as /admin and as /members... NEVER do unset($_SESSION)
    // $_SESSION=array(); is preferred, session_unset(); session_destroy();
    session_set_cookie_params(0, '/members', '.yourdomain.com', 0, 1);
    session_start();
    $_SESSION = array();
    session_unset();
    session_destroy();
    session_set_cookie_params(0, '/members', '.yourdomain.com', 0, 1);
    session_start();
    $_SESSION['whatever'] = 'youwhat';
    // session destroying 
    // To be safe, clear out your $_SESSION array
    // Next, what most people do NOT do is delete the session cookie!
    // It is easy to delete a cookie by expiring it long before the current time.
    // The ONLY WAY to delete a cookie, is to make sure ALL parameters match the
    // cookie to be deleted...which is easy to get those params with 
    // session_get_cookie_params()...
    // FInally, use session_unset(); and session_destroy(); in this order to ensure
    // Chrome, IE, Firefox and others, are properly destroying the session.
    $_SESSION = array();
    if (ini_get('session.use_cookies'))
    {
      $p = session_get_cookie_params();
      setcookie(session_name(), '', time() - 31536000, $p['path'], $p['domain'], $p['secure'], $p['httponly']);
     }
    session_unset();
    session_destroy();
    // AJAX and SESSIONS.
    // Example... you start a session based PHP page, which then calls an Ajax (XMLHTTP) authenticated
    // using the SAME SESSION to Poll and output the data, for example. But, you notice when you
    // try to start the Polling AJAX call always HANGS and seems to hang at the session_start().
    // This is because the session is opened in the first page, calls the AJAX polling example, and
    // tries to open the same session (for authentication) and do the AJAX call, you MUST call
    // session_write_close(); meaning you are done writing to the $_SESSION variable, which really
    // represents a file that must be CLOSED with session_write_close();....
    // THAN you can call your AJAX Polling code to reopen the same session and do its polling...
    // Normally, the $_SESSION is closed automatically when the script is closed or finished executing
    // So, if you need to keep a PHP page running after opening a SESSION, simply close it when finished
    // writing to $_SESSION so the AJAX polling page can authenticate and use the same session in a
    // seperate web page...
    session_write_close();
    ?>
    Hope this helps someone with their sessions...
    Thanks.
    When you have an import script that takes long to execute, the browser seem to lock up and you cannot access the website anymore. this is because a request is reading and locking the session file to prevent corruption.
    you can either 
    - use a different session handler with session_set_save_handler()
    - use session_write_close() in the import script as soon you don't need session anymore (best moment is just before the long during part takes place), you can session_start when ever you want and as many times you like if your import script requires session variables changed. 
    example
    <?php
    session_start(); //initiate / open session
    $_SESSION['count'] = 0; // store something in the session
    session_write_close(); //now close it, 
    # from here every other script can be run (and makes it seem like multitasking)
    for($i=0; $i<=100; $i++){ //do 100 cycles
      session_start(); //open the session again for editing a variable
      $_SESSION['count'] += 1; //change variable
      session_write_close(); //now close the session again!
      sleep(2); //every cycle sleep two seconds, or do a heavy task
    }
    ?>
    
    If you ever need to open multiple distinct sessions in the same script and still let PHP generate session ids for you, here is a simple function I came up with (PHP default session handler is assumed):
    <?php
    /**
     * Switch to or transparently create session with name $name.
     * It can easily be expanded to manage different sessions lifetime.
     */
    function session_switch($name = "PHPSESSID") {
        static $created_sessions = array();
        if (session_id() != '') { // if a session is currently opened, close it
          session_write_close();
        }
        session_name($name);
        if (isset($_COOKIE[$name])) {  // if a specific session already exists, merge with $created_sessions
          $created_sessions[$name] = $_COOKIE[$name];
        }
        if (isset($created_sessions[$name])) { // if existing session, impersonate it
          session_id($created_sessions[$name]);
          session_start();
        } else { // create new session
          session_start();
          $_SESSION = array(); // empty content before duplicating session file
                // duplicate last session file with new id and current $_SESSION content
                // If this is the first created session, there is nothing to duplicate from and passing true as argument will take care of "creating" only one session file
          session_regenerate_id(empty($created_sessions));
          $created_sessions[$name] = session_id();
        }
    }
    session_switch("SESSION1");
    $_SESSION["key"] = "value1"; // specific to session 1
    session_switch("SESSION2");
    $_SESSION["key"] = "value2"; // specific to session 2
    session_switch("SESSION1");
    // back to session 1
    // ...
    ?>
    When using this function, session_start() should not be called on its own anymore (can be replaced with a call to session_switch() without argument).
    Also remember that session_start() sets a Set-Cookie HTTP header on each call, so if you echo in-between sessions, wrap with ouput buffering.
    Note: it's probably rarely a good idea to handle multiple sessions so think again if you think you have a good use for it.
    Personally it played its role for some quick patching of legacy code I had to maintain.
    I just need with easy, count how many times the page reload over the site, may to add a warning popup, while the counter is 0:
    session_start();
    if(isset($_SESSION['count'])){
    $count = $_SESSION['count'];
    $count++; 
    $count = $_SESSION['count'] = $count;
    } else {
      $count = $_SESSION['count'] = 0;
    }
    echo $count;
    //session_destroy();
    Be warned that depending on end of script to close the session will effectively serialize concurrent session requests.  Concurrent background "data retrieval" (e.g. applications such as AJAX or amfphp/Flex) expecting to retrieve data in parallel can fall into this trap easily.
    Holding the session_write_close until after an expensive operation is likewise problematic.
    To minimize effects, call session_write_close (aka session_commit) as early as practical (e.g. without introducing race conditions) or otherwise avoid the serialization bottleneck.
    A simple session_start() will not be sufficiant to kepp you Session alive. 
    Due to the filesystems mounting parameters, atime will normally not be updated. Instead of atime, mtime will be delivered.
    This behavior may cause an early session death and your users my be kicked of your login system. 
    To keep the session alive it will be necessary to write something into the sessionfile at each request, e. g. a simple 
     "$_SESSION['time'] = time();"
    That would keep your session alive, even if the client in reality is only clicking around the site.
    To avoid the notice commited by PHP since 4.3.3 when you start a session twice, check session_id() first:
    if (session_id() == "")
     session_start();
    The problem with SID is that if on occasions you don't start a session, instead of outputting an empty string for transparent integration it will return the regular undefined constant notice. So you might want to test the constant with defined() beforehand.
    A note about session_start(), custom handlers and database foreign key constraints, which I think may be of some use...
    We know that if we want our sessions into a database table (rather than the default storage), we can refer to session_set_save_handler(...) to get them there. Note that session_set_save_handler must (obviously) be called before session_start(), but let me get to the point...
    Upon calling session_start() the "first time", when the session does not already exist, php will spawn a new session but will not call the write handler until script execution finishes.
    Thus, the session at this point exists in the server process memory, but won't be visible as a row in the DB before the script ends.
    This seems reasonable, because this avoids some unnecessary database access and resource usage before we even populate our session with meaningfull and definitive data, but this also has side-effects.
    In my case, the script called session_start() to make sure a session was initiated, then used session_id() to populate another table in the DB, which had foreign_key constraint to the "sessions" table. This failed because no session was in the db at that point, yet!
    I know I could simply force the creation of the row in the DB by manually calling the write handler after session_start(), when necessary, but I am not sure if this is the best possible approach.
    As soon as I find an "elegant" solution, or a completely different approach, I will post some working sample code.
    In the meanwhile... have fun!
    The following code shows how the PHP session works. The function my_session_start() does almost the same thing as session_start().
    <?php
    error_reporting(E_ALL);
    ini_set('display_errors', true);
    ini_set('session.save_path', __DIR__);
    my_session_start();
    echo '<p>session id: '.my_session_id().'</p>';
    echo '<code><pre>';
    var_dump($_SESSION);
    echo '</pre></code>';
    $now = date('H:i:s');
    if (isset($_SESSION['last_visit_time'])) {
     echo '<p>Last Visit Time: '.$_SESSION['last_visit_time'].'</p>';
    }
    echo '<p>Current Time: '.$now.'</p>';
    $_SESSION['last_visit_time'] = $now;
    function my_session_start() {
     global $phpsessid, $sessfile;
     
     if (!isset($_COOKIE['PHPSESSID']) || empty($_COOKIE['PHPSESSID'])) {
      $phpsessid = my_base32_encode(my_random_bytes(16));
      setcookie('PHPSESSID', $phpsessid, ini_get('session.cookie_lifetime'), ini_get('session.cookie_path'), ini_get('session.cookie_domain'), ini_get('session.cookie_secure'), ini_get('session.cookie_httponly'));
     } else {
      $phpsessid = substr(preg_replace('/[^a-z0-9]/', '', $_COOKIE['PHPSESSID']), 0, 26);
     }
     
     $sessfile = ini_get('session.save_path').'/sess_'.$phpsessid;
     if (is_file($sessfile)) {
      $_SESSION = unserialize(file_get_contents($sessfile));
     } else {
      $_SESSION = array();
     }
     register_shutdown_function('my_session_save');
    }
    function my_session_save() {
     global $sessfile;
     
     file_put_contents($sessfile, serialize($_SESSION));
    }
    function my_session_id() {
     global $phpsessid;
     return $phpsessid;
    }
    function my_random_bytes($length) {
     if (function_exists('random_bytes')) {
       return random_bytes($length);
     }
     $randomString = '';
     for ($i = 0; $i < $length; $i++) { 
       $randomString .= chr(rand(0, 255));
     } 
     return $randomString;
    }
    function my_base32_encode($input) {
     $BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
     $output = '';
     $v = 0;
     $vbits = 0;
     for ($i = 0, $j = strlen($input); $i < $j; $i++) {
      $v <<= 8;
      $v += ord($input[$i]);
      $vbits += 8;
      while ($vbits >= 5) {
       $vbits -= 5;
       $output .= $BASE32_ALPHABET[$v >> $vbits];
       $v &= ((1 << $vbits) - 1);
      }
     }
     if ($vbits > 0) {
      $v <<= (5 - $vbits);
      $output .= $BASE32_ALPHABET[$v];
     }
     return $output;
    }
    For those of you running in problems with UTF-8 encoded files:
    I was getting an error because of the BOM, although i set Dreamweaver to "save as" the without the BOM. It appears that DW will not change this setting in already existing files. After creating a new file withou the BOM, everything worked well.
    I also recommend http://people.w3.org/rishida/utils/bomtester/index.php - a utility that remote checks for the presence of BOM.
    TAGS: session_start headers output errors include_once require_once php tag new line
    Errors with output headers related to *session_start()* being called inside include files.
    If you are starting your session inside an include file you must be aware of the presence of undesired characters after php end tag.
    Let's take an example:
    > page.php
    <?php
    include_once 'i_have_php_end_tag.inc.php';
    include_once 'init_session.inc.php';
    echo "Damn! Why I'm having these output header errors?";
    ?>
    > i_have_php_end_tag.inc.php
    <?php
    $_JUST_A_GLOBAL_VAR = 'Yes, a global var, indeed';
    ?>
    > init_session.inc.php
    <?php
    session_start();
    $_SESSION['blabla'] = 123;
    ?>
    With all this stuff we will get an error, something like:
    "... Cannot send session cache limiter - headers already sent (output started at ...", right?
    To solve this problem we have to ignore all output sent by include files. To ensure that we need to use the couple of functions: *ob_start()* and *ob_end_clean()* to suppress the output. So, all we have to do is changing the *page.php* to this:
    <?php
    ob_start();
    include_once 'i_have_php_end_tag.inc.php';
    include_once 'init_session.inc.php';
    ob_end_clean();
    echo "Woo hoo! All right! Die you undesired outputs!!!";
    ?>
    
    James at skinsupport dot com raises a good point (warning) about additional requests from the browser. The request for favicon.ico, depending on how it is handled, can have unintended results on your sessions. 
    For example, suppose you have ErrorDocument 404 /signin.php, no favicon.ico file and all pages in your site where the user signs in are also redirected to /signin.php if they're not already signed in. 
    If signin.php does any clean up or reassigning of session_id (as all good signin.php pages should) then the additional request from the browser for favicon.ico could potentially corrupt the session as set by the actual request. 
    Kudos to James for pointing it out and shame on me for skimming past it and not seeing how it applied to my problem. Thanks too to the Firefox Live HTTP Headers extension for showing the additional request. 
    Don't waste days or even hours on this if your session cookies are not being sent or if the session data isn't what you expect it to be. At a minimum, eliminate this case and see if any additional requests could be at fault.
    Initiating a session may overwrite your own custom cache control header, which may break clicking back to get back to a prior post request (on Chrome at least).
    On my system it was setting 'no-store', which is much more severe than 'no-cache' and what was breaking the back-button.
    If you are controlling your own cache headers carefully you need to call:
    session_cache_limiter('');
    ...to stop it changing your cache control headers.
    I am trying to get a session created by a browser call to be used by a command line cli->curl php call (in this case, both calls to the same server and php.ini), for a set of flexible media import routines, 
    but the cli->curl call always starts a new session despite me putting PHPSESSID=validID as the first parameter for the url called by curl.
    I was able to fix it by calling session_id($_GET['PHPSESSID']) before calling session_start() in the script called via curl.
    if you store your sessions in a database, always ensure that the type of the database column is large enough for your session values
    A handy script that checks fot the presence of uft-8 byte order mark (BOM) in all files in all directories starting on current dir. Combined from the work of other people here...
    <?php
    function fopen_utf8 ($filename) {
      $file = @fopen($filename, "r");
      $bom = fread($file, 3);
      if ($bom != b"\xEF\xBB\xBF")
      {
        return false;
      }
      else
      {
        return true;
      }
    } 
    function file_array($path, $exclude = ".|..|design", $recursive = true) {
      $path = rtrim($path, "/") . "/";
      $folder_handle = opendir($path);
      $exclude_array = explode("|", $exclude);
      $result = array();
      while(false !== ($filename = readdir($folder_handle))) {
        if(!in_array(strtolower($filename), $exclude_array)) {
          if(is_dir($path . $filename . "/")) {
                    // Need to include full "path" or it's an infinite loop
            if($recursive) $result[] = file_array($path . $filename . "/", $exclude, true);
          } else {
            if ( fopen_utf8($path . $filename) )
            {
              //$result[] = $filename;
              echo ($path . $filename . "<br>");
            }
          }
        }
      }
      return $result;
    }
    $files = file_array(".");
    ?>
    
    It seems like spaces in the name don't work either - got a new session id generated each time
    If you are insane like me, and want to start a session from the cli so other scripts can access the same information.
    I don't know how reliable this is. The most obvious use I can see is setting pids.
    // temp.php
    #!/usr/bin/php -q
    <?php
    session_id ("temp");
    session_start();
    if ($_SESSION) {
      print_r ($_SESSION);
    }
    $_SESSION['test'] = "this is a test if sessions are usable inside scripts";
    ?>
    // Temp 2
    #!/usr/bin/php -q
    <?php
    session_id ("temp");
    session_start();
      print_r ($_SESSION);
    ?>
    
    workaround when using session variables in a .php file referred by a frame (.html, or other file type) at a different server than the one serving the .php:
    Under these conditions IE6 or later silently refuses the session cookie that is attempted to create (either implicitly or explicitly by invoquing session_start()).
    As a consequence, your session variable will return an empty value.
    According to MS kb, the workaround is to add a header that says your remote .php page will not abuse from the fact that permission has been granted.
    Place this header on the .php file that will create/update the session variables you want:
    <?php header('P3P: CP="CAO PSA OUR"'); ?>
    Regards,
    Hugo
    I need, with easy, count how many times the page reload over the site, may to add a warning popup, while the counter is 0 ...
    session_start();
    if(isset($_SESSION['count'])){
    $count = $_SESSION['count'];
    $count++; 
    $count = $_SESSION['count'] = $count;
    } else {
      $count = $_SESSION['count'] = 0;
    }
    echo $count;
    //session_destroy();
    One thing of note that caused me three days of trouble:
    It's important to note that Firefox (for one) makes two calls to the server automatically. One for the page, and one for favicon.ico.
    If you are setting session variables (as I was) to certain values when a page exists, and other values when pages don't exist, the values for non-existent pages will overwrite the values for existing pages if favicon.ico doesn't exist.
    I doubt many of you are doing this, but if you are, this is a consideration you need to address or you'll be bald over the course of a three day period!
    I just wrote that session_start() will erase your querystring variable(s) once called. I want to clarify that it will only do this if a variable by the same subscript is defined in $_SESSION[].
    How to fix session_start error?
    Sometimes when you made plugins, addons or some components in projects you need to check if session is started and if is not, you need to start it with no session_start() errors.
    Here is my tested solution what currently work on +9000 domains and in one my plugin but also in some custom works.
    <?php
    if (strnatcmp(phpversion(),'5.4.0') >= 0)
    {
      if (session_status() == PHP_SESSION_NONE) {
        session_start();
      }
    }
    else
    {
      if(session_id() == '') {
        session_start();
      }
    }
    ?>
    Feel free to use it and don't worry, be happy. ;)
    [Editors Note: For more information about this
    http://www.zvon.org/tmRFC/RFC882/Output/chapter5.html ]
     
    I use name-based virtual hosting on Linux with Apache and PHP 4.3.2. 
    Every time when I refreshed (by pressing F5 in Internet Explorer) I noticed that I got a new session_id. Simultaneously browsing the same site with Netscape didn't give me that problem. First I thought this was some PHP issue (before I tested it with Netscape), but after searching a lot on the internet I found the problem.
    Since I was using name based virtual hosting for my testserver and we have different webshops for different customers I used the syntax webshop_customername.servername.nl as the domain-name.
    The _ in the domain name seemed to be the problem. Internet Explorer just denies setting the cookie on the client when there is a special character (like an _ ) in the domain name. For more information regarding this issue: http://support.microsoft.com/default.aspx?scid=kb;EN-US;316112 
    Stupidly enough, this information was related to asp (yuk :o)
    Btw you can use:
    if (!isset($_SESSION)) {
    // We love every user
    session_start();
    // Then refresh for changes to take affect
    header("location: ../../");
    } elseif ($_SESSION["user] == "123ABC - abcmouse.com") {
    /* We don't like this user, so let's kick them out of
     the session */
    session_destroy();
    // Then refresh for changes to take affect
    header("location: ../../");
    }