Session start в php выдает ошибку

Здраствуйте! Начал изучать php, и вобщем не понимаю, почему код с session_start(); Выдает ошибку: Warning: session_start(): Cannot start session when headers already sent in W:domainsphp-learnscript.php on line 10

Вроде как эта команда создает сессию, но почему вобще появляется ошибка, и почему код работает без начала сессии.

Работает:

$_SESSION['text'] = $_REQUEST['text'];
        echo $_SESSION['text'];

Работает, но в первой строке ошибка:

session_start();
        $_SESSION['text'] = $_REQUEST['text'];
        echo $_SESSION['text'];

Весь код:

<?php
  session_start();
      $_SESSION['text'] = $_REQUEST['text'];
      echo $_SESSION['text'];
  ?>

<html lang="en" dir="ltr">
  <head>
    <meta charset="utf-8">
    <title>PHP</title>
  </head>
  <body>

      <form action="" method="GET">
           <textarea name='text'></textarea>
  	       <input type="submit">
      </form>
      <br>

  </body>
</html>

По учебнику Трепачева кстати, да и везде стоит сначала session_start(), и это должно быть правильно. Вобщем, заранее спасибо

i am getting Warning: session_start() [function.session-start]: Cannot send session cache limiter — headers already sent (output started at error

If i submit form data to a different file for processing, it works. But if i submit form data to the same page, it gives this error.

please suggst

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
<title>Welcome</title>


<script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
$(document).ready(function () { 

    $('#nav li').hover(
        function () {
            //show its submenu
            $('ul', this).slideDown(100);

        }, 
        function () {
            //hide its submenu
            $('ul', this).slideUp(100);         
        }
    );

});
    </script>

</head>

<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td class="header">&nbsp;</td>
  </tr>
  <tr>
    <td class="menu"><table align="center" cellpadding="0" cellspacing="0" width="80%">
    <tr>
    <td>

    <ul id="nav">
    <li><a href="#">Catalog</a>
    <ul><li><a href="#">Products</a></li>
        <li><a href="#">Bulk Upload</a></li>
        </ul>
        <div class="clear"></div>
        </li>


    <li><a href="#">Purchase  </a>

    </li>
    <li><a href="#">Customer Service</a>
    <ul>
        <li><a href="#">Contact Us</a></li>
        <li><a href="#">CS Panel</a></li>

    </ul>           
        <div class="clear"></div>
    </li>
    <li><a href="#">All Reports</a></li>
    <li><a href="#">Configuration</a>
    <ul> <li><a href="#">Look and Feel </a></li>
         <li><a href="#">Business Details</a></li>
         <li><a href="#">CS Details</a></li>
         <li><a href="#">Emaqil Template</a></li>
         <li><a href="#">Domain and Analytics</a></li>
         <li><a href="#">Courier</a></li>
         </ul>
    <div class="clear"></div>
    </li>
    <li><a href="#">Accounts</a>
    <ul><li><a href="#">Ledgers</a></li>
        <li><a href="#">Account Details</a></li>
        </ul>
         <div class="clear"></div></li>

</ul></td></tr></table></td>
  </tr>
  <tr>
    <td valign="top"><table width="80%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
          <tr>
            <td width="22%" height="327" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td height="45"><strong>-&gt; Products</strong></td>
                </tr>
              <tr>
                <td height="61"><strong>-&gt; Categories</strong></td>
                </tr>
              <tr>
                <td height="48"><strong>-&gt; Sub Categories</strong></td>
                </tr>
            </table></td>
            <td width="78%" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td>
                  <table width="90%" border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td width="26%">&nbsp;</td>
                      <td width="74%"><h2>Manage Categories</h2></td>
                    </tr>
                  </table></td>
                </tr>
              <tr>
                <td height="30">&nbsp;

                </td>
                </tr>
              <tr>
                <td>


</td>
                </tr>

                <tr>
                <td>
                <table width="49%" align="center" cellpadding="0" cellspacing="0">
                <tr><td>




<?php


                if (isset($_SESSION['error']))

                {

                    echo "<span id="error"><p>" . $_SESSION['error'] . "</p></span>";

                    unset($_SESSION['error']);

                }

                ?>

                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">

                <p>
                 <label class="style4">Category Name</label>

                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="categoryname" /><br /><br />

                    <label class="style4">Category Image</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                    <input type="file" name="image" /><br />

                    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />

                   <br />
<br />
 <input type="submit" id="submit" value="UPLOAD" />

                </p>

                </form>




                             <?php

session_start();

require("includes/conn.php");


function is_valid_type($file)

{

    $valid_types = array("image/jpg", "image/jpeg", "image/bmp", "image/gif", "image/png");



    if (in_array($file['type'], $valid_types))

        return 1;

    return 0;
}

function showContents($array)

{

    echo "<pre>";

    print_r($array);

    echo "</pre>";
}


$TARGET_PATH = "images/category";

$cname = $_POST['categoryname'];

$image = $_FILES['image'];

$cname = mysql_real_escape_string($cname);

$image['name'] = mysql_real_escape_string($image['name']);

$TARGET_PATH .= $image['name'];

if ( $cname == "" || $image['name'] == "" )

{

    $_SESSION['error'] = "All fields are required";

    header("Location: managecategories.php");

    exit;

}

if (!is_valid_type($image))

{

    $_SESSION['error'] = "You must upload a jpeg, gif, or bmp";

    header("Location: managecategories.php");

    exit;

}




if (file_exists($TARGET_PATH))

{

    $_SESSION['error'] = "A file with that name already exists";

    header("Location: managecategories.php");

    exit;

}


if (move_uploaded_file($image['tmp_name'], $TARGET_PATH))

{



    $sql = "insert into Categories (CategoryName, FileName) values ('$cname', '" . $image['name'] . "')";

    $result = mysql_query($sql) or die ("Could not insert data into DB: " . mysql_error());

  header("Location: mangaecategories.php");

    exit;

}

else

{





    $_SESSION['error'] = "Could not upload file.  Check read/write persmissions on the directory";

    header("Location: mangagecategories.php");

    exit;

}

?> 

Here is the code for Display

<?php  
                  require("includes/conn.php"); 



                $sql = "select CategoryID, CategoryName, FileName, Status from Categories";

                $result = mysql_query($sql) or die ("Could not access DB: " . mysql_error());



                while ($row = mysql_fetch_assoc($result))

                {

                     echo "<table border='0' cellpadding='10'>";


                                        echo "<tr><td>  </td><td>Category ID</td><td>Category Name</td><td>Status</td><td>Edit</td><td>Delete</td></tr>";

                                        echo "<tr><td> <img src="images/" . $row['FileName'] . "" alt="" /> </td>";
                                        echo "<td>". $row['CategoryID'] . "</td>";
                                            echo "<td>". $row['CategoryName'] . "</td>";
                                            echo "<td>". $row['Status']. "</td>";
                                            echo "<td> <a href= 'edit.php?CategoryID=" .$row['id']. "'> Edit </a></td>";
                                            echo "<td> <a href= 'delete.php?CategoryID=" .$row['id']. "'> Edit </a></td>";
                                         echo "</tr> </table>";

                }



            ?>

Nothing is happening here. Please suggest

asked May 16, 2012 at 4:45

user1321271's user avatar

user1321271user1321271

2553 gold badges10 silver badges21 bronze badges

3

You will find I have added the session_start() at the very top of the page. I have also removed the session_start() call later in the page. This page should work fine.

<?php
session_start();
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link href="style.css" rel="stylesheet" type="text/css" />
<title>Welcome</title>


<script type="text/javascript" src="jquery.js"></script>
    <script type="text/javascript">
$(document).ready(function () { 

    $('#nav li').hover(
        function () {
            //show its submenu
            $('ul', this).slideDown(100);

        }, 
        function () {
            //hide its submenu
            $('ul', this).slideUp(100);         
        }
    );

});
    </script>

</head>

<body>
<table width="100%" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td class="header">&nbsp;</td>
  </tr>
  <tr>
    <td class="menu"><table align="center" cellpadding="0" cellspacing="0" width="80%">
    <tr>
    <td>

    <ul id="nav">
    <li><a href="#">Catalog</a>
    <ul><li><a href="#">Products</a></li>
        <li><a href="#">Bulk Upload</a></li>
        </ul>
        <div class="clear"></div>
        </li>


    <li><a href="#">Purchase  </a>

    </li>
    <li><a href="#">Customer Service</a>
    <ul>
        <li><a href="#">Contact Us</a></li>
        <li><a href="#">CS Panel</a></li>

    </ul>           
        <div class="clear"></div>
    </li>
    <li><a href="#">All Reports</a></li>
    <li><a href="#">Configuration</a>
    <ul> <li><a href="#">Look and Feel </a></li>
         <li><a href="#">Business Details</a></li>
         <li><a href="#">CS Details</a></li>
         <li><a href="#">Emaqil Template</a></li>
         <li><a href="#">Domain and Analytics</a></li>
         <li><a href="#">Courier</a></li>
         </ul>
    <div class="clear"></div>
    </li>
    <li><a href="#">Accounts</a>
    <ul><li><a href="#">Ledgers</a></li>
        <li><a href="#">Account Details</a></li>
        </ul>
         <div class="clear"></div></li>

</ul></td></tr></table></td>
  </tr>
  <tr>
    <td valign="top"><table width="80%" border="0" align="center" cellpadding="0" cellspacing="0">
      <tr>
        <td valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
          <tr>
            <td width="22%" height="327" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="2">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td height="45"><strong>-&gt; Products</strong></td>
                </tr>
              <tr>
                <td height="61"><strong>-&gt; Categories</strong></td>
                </tr>
              <tr>
                <td height="48"><strong>-&gt; Sub Categories</strong></td>
                </tr>
            </table></td>
            <td width="78%" valign="top"><table width="100%" border="0" cellpadding="0" cellspacing="0">
              <tr>
                <td>&nbsp;</td>
                </tr>
              <tr>
                <td>
                  <table width="90%" border="0" cellspacing="0" cellpadding="0">
                    <tr>
                      <td width="26%">&nbsp;</td>
                      <td width="74%"><h2>Manage Categories</h2></td>
                    </tr>
                  </table></td>
                </tr>
              <tr>
                <td height="30">&nbsp;

                </td>
                </tr>
              <tr>
                <td>


</td>
                </tr>

                <tr>
                <td>
                <table width="49%" align="center" cellpadding="0" cellspacing="0">
                <tr><td>




<?php


                if (isset($_SESSION['error']))

                {

                    echo "<span id="error"><p>" . $_SESSION['error'] . "</p></span>";

                    unset($_SESSION['error']);

                }

                ?>

                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">

                <p>
                 <label class="style4">Category Name</label>

                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="categoryname" /><br /><br />

                    <label class="style4">Category Image</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                    <input type="file" name="image" /><br />

                    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />

                   <br />
<br />
 <input type="submit" id="submit" value="UPLOAD" />

                </p>

                </form>




                             <?php


require("includes/conn.php");


function is_valid_type($file)

{

    $valid_types = array("image/jpg", "image/jpeg", "image/bmp", "image/gif", "image/png");



    if (in_array($file['type'], $valid_types))

        return 1;

    return 0;
}

function showContents($array)

{

    echo "<pre>";

    print_r($array);

    echo "</pre>";
}


$TARGET_PATH = "images/category";

$cname = $_POST['categoryname'];

$image = $_FILES['image'];

$cname = mysql_real_escape_string($cname);

$image['name'] = mysql_real_escape_string($image['name']);

$TARGET_PATH .= $image['name'];

if ( $cname == "" || $image['name'] == "" )

{

    $_SESSION['error'] = "All fields are required";

    header("Location: managecategories.php");

    exit;

}

if (!is_valid_type($image))

{

    $_SESSION['error'] = "You must upload a jpeg, gif, or bmp";

    header("Location: managecategories.php");

    exit;

}




if (file_exists($TARGET_PATH))

{

    $_SESSION['error'] = "A file with that name already exists";

    header("Location: managecategories.php");

    exit;

}


if (move_uploaded_file($image['tmp_name'], $TARGET_PATH))

{



    $sql = "insert into Categories (CategoryName, FileName) values ('$cname', '" . $image['name'] . "')";

    $result = mysql_query($sql) or die ("Could not insert data into DB: " . mysql_error());

  header("Location: mangaecategories.php");

    exit;

}

else

{





    $_SESSION['error'] = "Could not upload file.  Check read/write persmissions on the directory";

    header("Location: mangagecategories.php");

    exit;

}

?> 

answered May 16, 2012 at 5:22

somnath's user avatar

somnathsomnath

1,3371 gold badge9 silver badges13 bronze badges

4

I had the same issue, but my solution wasn’t as obvious as the suggested ones. It turned out that my php-file was written in UTF-8, which caused issues. I copy/pasted the content of the entire file into a new php-file (Notepad++ tells me this is written in ANSI rather than UTF-8), and now it work flawlessly.

answered May 9, 2013 at 14:31

Birb's user avatar

BirbBirb

86610 silver badges23 bronze badges

4

The answer is above by Ross.

Firstly, putting session_start() as the first line of code will mean that you cannot deserialise any objects correctly into session variables.

The reason for getting this issue is 99% likely to be trailing spaces at the end of your include files (yes — I know it sounds unlikely but just try it). The offending file is in the error message. I wanted to back up Ross answer which worked for me but this site is counter intuitive.

IGNORE the nonsense answers. Remove the trailing spaces, newlines etc… and all will be well. ROSS knows what he is talking about.
Putting session_start() at the top of your file DOES work but it isnt the correct solution.

answered Mar 1, 2016 at 1:13

Chris B's user avatar

Chris BChris B

1011 silver badge2 bronze badges

2

replace session_start(); with @session_start(); in your code

Anatolii's user avatar

Anatolii

14k3 gold badges35 silver badges65 bronze badges

answered May 16, 2012 at 4:48

Satya's user avatar

SatyaSatya

8,6135 gold badges34 silver badges54 bronze badges

1

This should solve your problem. session_start() should be called before any character is sent back to the browser. In your case, HTML and blank lines were sent before you called session_start(). Documentation here.

To further explain your question of why it works when you submit to a different page, that page either do not use session_start() or calls session_start() before sending any character back to the client! This page on the other hand was calling session_start() much later when a lot of HTML has been sent back to the client (browser).

The better way to code is to have a common header file that calls connects to MySQL database, calls session_start() and does other common things for all pages and include that file on top of each page like below:

include "header.php";

This will stop issues like you are having as also allow you to have a common set of code to manage across a project. Something definitely for you to think about I would suggest after looking at your code.

<?php
session_start();

                if (isset($_SESSION['error']))

                {

                    echo "<span id="error"><p>" . $_SESSION['error'] . "</p></span>";

                    unset($_SESSION['error']);

                }

                ?>

                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="multipart/form-data">

                <p>
                 <label class="style4">Category Name</label>

                   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="categoryname" /><br /><br />

                    <label class="style4">Category Image</label>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                    <input type="file" name="image" /><br />

                    <input type="hidden" name="MAX_FILE_SIZE" value="100000" />

                   <br />
<br />
 <input type="submit" id="submit" value="UPLOAD" />

                </p>

                </form>




                             <?php



require("includes/conn.php");


function is_valid_type($file)

{

    $valid_types = array("image/jpg", "image/jpeg", "image/bmp", "image/gif", "image/png");



    if (in_array($file['type'], $valid_types))

        return 1;

    return 0;
}

function showContents($array)

{

    echo "<pre>";

    print_r($array);

    echo "</pre>";
}


$TARGET_PATH = "images/category";

$cname = $_POST['categoryname'];

$image = $_FILES['image'];

$cname = mysql_real_escape_string($cname);

$image['name'] = mysql_real_escape_string($image['name']);

$TARGET_PATH .= $image['name'];

if ( $cname == "" || $image['name'] == "" )

{

    $_SESSION['error'] = "All fields are required";

    header("Location: managecategories.php");

    exit;

}

if (!is_valid_type($image))

{

    $_SESSION['error'] = "You must upload a jpeg, gif, or bmp";

    header("Location: managecategories.php");

    exit;

}




if (file_exists($TARGET_PATH))

{

    $_SESSION['error'] = "A file with that name already exists";

    header("Location: managecategories.php");

    exit;

}


if (move_uploaded_file($image['tmp_name'], $TARGET_PATH))

{



    $sql = "insert into Categories (CategoryName, FileName) values ('$cname', '" . $image['name'] . "')";

    $result = mysql_query($sql) or die ("Could not insert data into DB: " . mysql_error());

  header("Location: mangaecategories.php");

    exit;

}

else

{





    $_SESSION['error'] = "Could not upload file.  Check read/write persmissions on the directory";

    header("Location: mangagecategories.php");

    exit;

}

?> 

answered May 16, 2012 at 4:49

somnath's user avatar

somnathsomnath

1,3371 gold badge9 silver badges13 bronze badges

2

use ob_start(); before session_start(); at top of your page like this

<?php
ob_start();
session_start();

answered May 16, 2012 at 5:23

Altaf Hussain's user avatar

Altaf HussainAltaf Hussain

1,0482 gold badges12 silver badges25 bronze badges

3

For others who may run across this — it can also occur if someone carelessly leaves trailing spaces from a php include file. Example:

 <?php 
    require_once('mylib.php');
    session_start();
 ?>

In the case above, if the mylib.php has blank spaces after its closing ?> tag, this will cause an error. This obviously can get annoying if you’ve included/required many files. Luckily the error tells you which file is offending.

HTH

answered Dec 16, 2013 at 1:04

Ross's user avatar

RossRoss

1,6391 gold badge18 silver badges22 bronze badges

Generally this error arise when we send header after echoing or printing. If this error arise on a specific page then make sure that page is not echoing anything before calling to start_session().

Example of Unpredictable Error:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content

One more example:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content

Conclusion: Do not output any character before calling session_start() or header() functions not even a white-space or new-line

answered Feb 3, 2015 at 4:42

Biswadeep Sarkar's user avatar

1

Just replace session_start with this.

if (!session_id() && !headers_sent()) {
   session_start();
}  

You can put it anywhere, even at the end :)
Works fine for me. $_SESSION is accessible as well.

answered Oct 23, 2017 at 4:57

Eugene Lycenok's user avatar

use session_start() at the top of the page.

for more details please read the link session_start

answered May 16, 2012 at 4:49

jogesh_pi's user avatar

jogesh_pijogesh_pi

9,7624 gold badges36 silver badges65 bronze badges

I was able to solve similar Warning: session_start(): Cannot send session cache limiter - headers already sent by just removing a space in front of the <?php tag.

It worked.

Vasily Kabunov's user avatar

answered Aug 14, 2016 at 9:47

Daniel Osei's user avatar

1

I had a website transferring from one host to another, it seemed to work fine on the old host but a few pages on the new host threw the error

Warning: session_start(): Cannot send session cache limiter - headers already sent

while I always kept the

 <?php
session_start(); 

at the top of the page no spaces and nothing inserted before

it really bugged me that I stared every page with the session opening, and it worked on some pages and run through a bug on others
I picked the pages that had the problems, backed them up, created new blank pages and simply copied and pasted the code as is, saved and uploaded and boom, problem gone!

this is something you guys may need to consider, it may have been the encoding of the page, or something, not sure the exact source of the problem, but here is a fix to look at in case you guys run into a similar problem

cheers!

answered Jan 17, 2017 at 5:37

Abdelkader Soudani's user avatar

In my case I had to set the file encoding without BOM.

answered May 6, 2016 at 5:54

Wessam El Mahdy's user avatar

This started for me when I redirected my site to https:// (for SSL Certificate). From my experience with this issue, the session_start() had to be before the browser saw any HTML code. For my example, I was using session_start() in nav.php to determine the options of the navigation bar. I ended up placing session_start() right after the php comments in the index.php file and every page which called nav.php. I was able to keep the php comments before session_start() but could not keep the HTML comments above the php.

Stephen Rauch's user avatar

Stephen Rauch

47.5k31 gold badges106 silver badges135 bronze badges

answered Sep 22, 2018 at 2:11

John Fischer's user avatar

Check any extra space before php tag.

answered Jan 24, 2019 at 9:01

Brijesh Tanwar's user avatar

(PHP 4, PHP 5, PHP 7, PHP 8)

session_startСтартует новую сессию, либо возобновляет существующую

Описание

session_start(array $options = []): bool

Когда вызвана функция session_start() или когда сессия создаётся
автоматически, PHP вызовет открытие и чтение обработчиков записи сессии. Это могут
быть как встроенные обработчики, так и предоставляемые модулями (например,
SQLite или Memcached); или вообще определённый пользователем обработчик, заданный
функцией session_set_save_handler().
Callback-функция чтения извлечёт все существующие данные сессии (сохранённые в
специальном сериализованном виде), десериализует их и занесёт в суперглобальный
массив $_SESSION, после чего вернёт сохранённые данные обработчику сессий PHP.

Для использования именованных сессий, используйте
session_name() перед
session_start().

Если разрешена опция session.use_trans_sid,
функция session_start() регистрирует внутренний обработчик вывода
для перезаписи URL.

Если пользователь использует ob_gzhandler или что-то подобное
совместно с функцией ob_start(), порядок функций важен для
правильного вывода. К примеру, ob_gzhandler должен быть
зарегистрирован до старта сессии.

Список параметров

options

Если задано, то должно быть ассоциативным массивом, переопределяющим
текущие директивы конфигурации сессий.
Ключи не должны иметь префикса session..

В дополнение к обычному набору конфигурационных директив, может быть
добавлена опция read_and_close. Если установлена в true, то
сессия будет закрыта сразу же после прочтения, теоретически позволяя избежать
блокировки, если данные сессии не будут изменяться.

Возвращаемые значения

Функция возвращает true, если сессия успешно стартована, в противном случае false.

Список изменений

Версия Описание
7.1.0 session_start() теперь возвращает false и больше не
инициализирует $_SESSION, когда она не смогла запустить сессию.

Примеры

Простой пример сессии

Пример #1 page1.php


<?php
// page1.phpsession_start();

echo

'Добро пожаловать на страницу 1';$_SESSION['favcolor'] = 'green';
$_SESSION['animal'] = 'cat';
$_SESSION['time'] = time();// Работает, если сессионная cookie принята
echo '<br /><a href="page2.php">page 2</a>';// Или можно передать идентификатор сессии, если нужно
echo '<br /><a href="page2.php?' . SID . '">page 2</a>';
?>

После просмотра page1.php, вторая страница
page2.php чудесным образом получит все данные сессии.
Читайте раздел работа с сессиями,
там рассказывается про передачу
идентификаторов сессий. В частности там рассказывается про то, что
такое константа SID.

Пример #2 page2.php


<?php
// page2.phpsession_start();

echo

'Добро пожаловать на страницу 2<br />';

echo

$_SESSION['favcolor']; // green
echo $_SESSION['animal']; // cat
echo date('Y m d H:i:s', $_SESSION['time']);// Можете тут использовать идентификатор сессии, как в page1.php
echo '<br /><a href="page1.php">page 1</a>';
?>

Передача опций в session_start()

Пример #3 Переопределение времени жизни cookie


<?php
// Устанавливаем срок действия cookie одному дню.
session_start([
'cookie_lifetime' => 86400,
]);
?>

Пример #4 Чтение и закрытие сессии


<?php
// Если мы знаем, что в сессии не надо ничего изменять,
// мы можем просто прочитать её переменные и сразу закрыть,
// чтобы не блокировать файл сессии, который может понадобиться другим сессиям
session_start([
'cookie_lifetime' => 86400,
'read_and_close' => true,
]);


Примечания

Замечание:

Для использования сессий на основе cookie, функция session_start()
должна быть вызвана перед выводом чего бы то ни было в браузер.

Замечание:

Используйте zlib.output_compression
вместо ob_gzhandler()

Замечание:

Эта функция отсылает несколько заголовков HTTP, в зависимости от настроек.
Смотрите описание функции session_cache_limiter() для
управления этими заголовками.

ohcc at 163 dot com

9 years ago


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.


linblow at hotmail dot fr

12 years ago


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.


marco dot agnoli at me dot com

5 years ago


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:

```
<?phpfunction 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!


bachtel at [googles email service]dotcom

6 years ago


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:

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


aaronw at catalyst dot net dot nz

8 years ago


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


emre@yazici

13 years ago


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.


dave1010 at gmail dot com

12 years ago


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/


elitescripts2000 at yahoo dot com

9 years ago


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.


someOne_01 at somewhere dot com

10 years ago


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

}

?>


Anonymous

2 years ago


Be careful with the 'read_and_close' option. It doesn't update the session file's last modification time unlike the default PHP behaviour when you don't close the session (or when you use session_write_close explicitly).
Old session files (for me, older than 24 minutes) will be occasionally cleared by the garbage collector (for me every 09 and 39 minute of every hour).
So a session can disappear even if the page regularly sends requests to the server that only reads and closes the session.

jamestrowbridge at gmail dot com

13 years ago


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.


ben dot morin at spaboom dot com

16 years ago


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.


James

16 years ago


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


hu60 dot cn at gmail dot com

3 years ago


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


schlang

13 years ago


if you store your sessions in a database, always ensure that the type of the database column is large enough for your session values

jorrizza at gmail dot com

18 years ago


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
?>


andy_isherwood at hotmail dot com

14 years ago


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.


bwz

4 months ago


Be warned of another issue with blocking sessions: if you want to call an external program (or use an external service) that needs to access your website using the same session.

For example I am printing a page as a PDF. I can just save the web page as a HTML file. But the images in the HTML are also private and require the current user session to be seen.

What will happen is that this program might hang indefinitely (or timeout) as session_start waits for the parent PHP process to release the lock. And session_start doesn't obey max_execution_time (as documented in this bug: https://bugs.php.net/bug.php?id=72345 ), so this will effectively kill the server after a few requests, as each one will be hanging forever

It's the same if you use an external HTTP service:

<?php
$pdf
= file_get_contents('http://pdf.website.tld/?url=http://website.tld/print.php');
?>

The service will wait for the website host to release the lock, but it can't as it is waiting for the PDF service to finish...

The nice solution is to release the lock immediately by calling session_write_close after session_start, and when you need to write to the session you do the same again, but as noted it has its own issues. Using a custom session handler is probably the best solution.


polygon dot co dot in at gmail dot com

1 year ago


Websites are prone to Session Attack where its proper usage is not done.

There are tools like "Apache Benchmark" (ab) and many others which can hit the website with load for load / performance testing.

Code below starts the session for every request.

<?php
session_start
();$username = $_POST['username'];
$password = $_POST['password'];

if(

isValidUser($username, $password)) {Suserdetails = getUserDetails($username);$_SESSION['user_id']    = Suserdetails['user_id'];
   
$_SESSION['username']    = Suserdetails['username'];
   
$_SESSION['firstname']    = Suserdetails['firstname'];header('Location: dashboard.php');
}
?>

This generates session file for every request irrespective of PHPSESSID cookie value when I use tools like ab, there by creating inode issue.

One should start the session after properly authenticating.

<?php

$username

= $_POST['username'];
$password = $_POST['password'];

if(

isValidUser($username, $password)) {Suserdetails = getUserDetails($username);session_start();$_SESSION['user_id']    = Suserdetails['user_id'];
   
$_SESSION['username']    = Suserdetails['username'];
   
$_SESSION['firstname']    = Suserdetails['firstname'];header('Location: dashboard.php');
}
?>

Scripts other then login first validates session which requires session.

<?phpif(session_status()!=PHP_SESSION_NONEheader('Location: login.php');session_start();

    if(!isset(

$_SESSION['user_id'])) header('Location: login.php');code logic below....
}
?>

This example is for file based session.
For other modes of session check function session_set_save_handler.


axew3 at axew3 dot com

5 years ago


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


chris at ocproducts dot com

6 years ago


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.


fabmlk at hotmail dot com

7 years ago


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.


ilnomedellaccount at gmail dot com

9 years ago


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!


info at nospam dot mmfilm dot sk

13 years ago


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.


Charlie at NOSPAM dot example dot com

13 years ago


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.


tom at bitworks dot de

5 years ago


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.


axew3 at axew3 dot com

5 years ago


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


sanjuro at 1up-games dot com

11 years ago


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.

info.at.merchandisinginteractive.sk

13 years ago


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"xEFxBBxBF")

    {

        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(".");

?>


m dot kuiphuis at hccnet dot nl

19 years ago


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


anon at ymous dot com

12 years ago


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.


dstuff at brainsware dot org

13 years ago


It seems like spaces in the name don't work either - got a new session id generated each time

leandroico—at—gmail—dot—com

16 years ago


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!!!";
?>


jphansen at uga dot edu

15 years ago


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[].

erm[at]the[dash]erm[dot]com

18 years ago


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


james at skinsupport dot com

17 years ago


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!


ivijan dot stefan at gmail dot com

6 years ago


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. ;)


hbertini at sapo dot pt

18 years ago


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


Nathan

4 years ago


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


i have some Problems with session_start();

I know that nothing should be outputted before the session_start(); statement

But i can’t find the Problem in my Script

index.php:

<?php session_start();
include('functions.php');
if(!is_logged_in(session_id())){
    include('form.php');
}else{
?>
<html>
<head>
<title></title>
</head>
<body>
</body>
</html>
<?php
}
?>

But i always geh following Error:

Warning: session_start()
[function.session-start]: Cannot send
session cookie — headers already sent
by (output started at
C:xampphtdocsfertige_scanindex.php:1)
in
C:xampphtdocsfertige_scanindex.php
on line 1

I hope you can help me :)

PHP: 12 причин, по которым не работают сессии

Хотя PHP последних версий стал работать с сессиями гораздо лучше, начинающие (а порой и опытные) программисты всё ещё нередко мучаются с ними,
особенно если речь идёт об адаптации старого кода к новым версиям. В этой заметке я собрал самые
распространённые причины, по которым могут не работать сессии (авторизация не выполняется, вход на сайт
происходит только со второго раза и т.п.)

Сначала разумные причины:

1. Сессия не запущена.

То есть, не вызывалась функция session_start. Самая банальная и самая частая причина. Вызов session_start должен выполняться на каждой странице, где используются данные из массива $_SESSION.

Лучше всего вызывать session_start сразу после открывающего тега <?php

Я часто в запутанном коде из множества модулей делаю это в виде

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

Есть смысл также запускать сессию только из модуля с функциями, подключаемыми к каждой странице сайта кодом вроде этого:

 require_once ("functions.php");

2. Сессия или её данные удаляются из кода раньше, чем должны использоваться.

В сложных многомодульных скриптах это вполне возможно, тем более, сделать это можно несколькими способами —
через функцию session_destroy, «прямой» очисткой массива сессии кодом вида $_SESSION = array(); или $_SESSION = []; или unset($_SESSION['name']) или просто unset($_SESSION); — в последнем случае, правда, сгенерируется предупреждение. «Прошерстите» код, чтобы убедиться, что этого не происходит.

3. Хранилище сессии недоступно для записи.

Выполните на хосте функцию phpinfo и проверьте значение session.save_path — это папка, куда сохраняется сессия.

Зайдите в неё и посмотрите, есть ли там свежие файлы с именами вроде
sess_***** или *****.tmp. Если файлов нет — сессия не может сохраниться
из-за отстутствия прав на доступ к папке. Установите их.

4. Данные сессии не записываются после отправки заголовка.

Если страница после выполнения кода редиректит на другую страницу при
помощи функции header,
может понадобиться добавить непосредственно после вызова header вызов функции
session_write_close (или exit, die), чтобы сессия могла корректно записать данные.

5. В браузере не включены Cookies.

Механизм куки-файлов необходим для работы сессий. Проверьте, что куки разрешены в браузере.

6. В коде или настройках сайта происходит редирект с одного домена на другой.

При редиректе сессия потеряется, даже если это редирект с site.com на www.site.com или наоборот.

7. Некорректная работа со временем в скрипте.

Скрипт имеет тысячу и один способ использовать время, отличающееся от серверного, в том числе, ставить время для куки и т.п.

А что если в момент создания кука оказывается уже просроченной?

Неплохо также в файле .htaccess настроить часовой пояс явно, скажем

SetEnv TZ Asia/Krasnoyarsk
php_value date.timezone "Asia/Krasnoyarsk"

8. Устаревшие функции сессий.

Например, код всё ещё использует session_register, а она давно удалена из языка. Проверьте и другие функции сессий — нужно ли их все применять?

Мне сегодня помог п. 4 при «реанимации» работающего «со второго входа» сайтега.

Теперь причины более экзотические, которых, вроде бы, не должно быть, а они случаются.

9. На сайте нет файла favicon.ico или favicon.png

Некоторым бразуерам (Chrome) на некоторых серверах (nginx) это может помешать работе с сессиями, хотя понятных причин я назвать не могу.

10. У вас в файле кодировка UTF-8 с меткой BOM.

Избавьтесь от неё. Хотя, по идее, вы должны были увидеть раньше популярнейшее предупреждение (warning) «headers already sent» (см. по ссылке). Но бывает, что не усмотрел директивы отключения варнингов где-нибудь в недрах кода…
Кстати, включите контроль всех ошибок при работе.

11. Лишние символы, например, пробелы после закрывающего тега PHP ?>

Что тут сказать? Избавьтесь от них.

12. Так легла карта.

Скорее всего, сессия просто стартует не там, где Вы думаете.

print_r($_SESSION);

везде по коду — и вперёд.

17.06.2021, 12:57 [4216 просмотров]


К этой статье пока нет комментариев, Ваш будет первым

Понравилась статья? Поделить с друзьями:
  • Service due audi q5 как убрать ошибку
  • Servo alarm ошибка на лазерном станке
  • Service due audi q5 как сбросить ошибку
  • Servisfa ru ошибка авторизации что делать
  • Service control manager ошибка код события 7001