From:             d dot geels at grape dot ru
Operating system: any
PHP version:      4.3.10
PHP Bug Type:     Output Control
Bug description:  session_start(): Cannot send session cache limiter

Description:
------------
The problem described already in user contributed noted in documentation.
Strange, that it is not yet fixed...
Also problem mentioned in http://bugs.php.net/bug.php?id=11213
==================================
laacz at laacz dot lv (28-Oct-2004 03:37)

If You are not using cookies to store session_id's, that does not mean,
that session_start() will not send any headers at all. It still sends
cache controlling information to user. For example:
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0,
pre-check=0
Pragma: no-cache
Even, if You set cache_limiter to none (via ini_set('session.use_cookies',
0) or ini_set('session.cache_limiter', 'none')), session_start() still
tries to send empty headers and that causes error message "Cannot send
session cache limiter - headers already sent". So, use output buffering,
if You need to output something before session_start(). 
==================================
even session_cache_limiter('none') doesn't work

In my case, problem is that I call session_start(), then
session_write_close() in the beginning, then send data, then call
session_start(), then session_write_close() in the function, registered on
shutdown.
There are two reasons, why I do so:
1) there are several processes, that access same session (I use
md5($_SERVER['REMOTE_ADDR']) as session_id)
2) I can't buffer output at all. Amount of data is very large, it is a
file being downloaded. It must be sent ASAP.

Reproduce code:
---------------
if(!empty($_SERVER['HTTP_RANGE'])){
        $sid = md5($_SERVER['REMOTE_ADDR']);
        ini_set('session.use_cookies', 0);
        session_cache_limiter('public'); // for IE "Open" bug
        session_id($sid);
        session_start(); //this one starts normally
        //check, if this download thread is permitted or not
        if(!empty($_SESSION['file_'.$file_id]) && $_SESSION['file_'.$file_id] >=
MAX_DOWNLOAD_THREADS){
                header('HTTP/1.1 403 Forbidden', true, 403);
                exit;
        }elseif(!isset($_SESSION['file_'.$file_id])) $_SESSION['file_'.$file_id]
= 0;
        $_SESSION['file_'.$file_id]++;
        session_write_close();
        //close session ASAP, because else other processes would be blocked

        //this function will decrement threads counter...
        function decrementCounter($sid, $file_id)
        {
//this must help us evade "Warning:  session_start(): Cannot send session
cache limiter - headers already sent"
                session_cache_limiter('none');

                session_id($sid);
                session_start(); // this is line #45
                //decrement threads counter
                $_SESSION['file_'.$file_id]--;
                session_write_close();
                //close session ASAP
        }

        //... when script finished
        register_shutdown_function('decrementCounter', $sid, $file_id);
}

Expected result:
----------------
No warnings in log file.

Actual result:
--------------
[Tue Mar 22 18:32:08 2005] [error] PHP Warning:  session_start(): Cannot
send session cache limiter - headers already sent (output started at
/home/httpd/pantech/htdocs/file.php:144) in
/home/httpd/pantech/htdocs/file.php on line 45

reproduced always, when user downloading a file

line 144 sends data to client:
echo fread( $fp, $size > READ_BLOCK_SIZE ? READ_BLOCK_SIZE : $size );


-- 
Edit bug report at http://bugs.php.net/?id=32414&edit=1
-- 
Try a CVS snapshot (php4):   http://bugs.php.net/fix.php?id=32414&r=trysnapshot4
Try a CVS snapshot (php5.0): 
http://bugs.php.net/fix.php?id=32414&r=trysnapshot50
Try a CVS snapshot (php5.1): 
http://bugs.php.net/fix.php?id=32414&r=trysnapshot51
Fixed in CVS:                http://bugs.php.net/fix.php?id=32414&r=fixedcvs
Fixed in release:            http://bugs.php.net/fix.php?id=32414&r=alreadyfixed
Need backtrace:              http://bugs.php.net/fix.php?id=32414&r=needtrace
Need Reproduce Script:       http://bugs.php.net/fix.php?id=32414&r=needscript
Try newer version:           http://bugs.php.net/fix.php?id=32414&r=oldversion
Not developer issue:         http://bugs.php.net/fix.php?id=32414&r=support
Expected behavior:           http://bugs.php.net/fix.php?id=32414&r=notwrong
Not enough info:             
http://bugs.php.net/fix.php?id=32414&r=notenoughinfo
Submitted twice:             
http://bugs.php.net/fix.php?id=32414&r=submittedtwice
register_globals:            http://bugs.php.net/fix.php?id=32414&r=globals
PHP 3 support discontinued:  http://bugs.php.net/fix.php?id=32414&r=php3
Daylight Savings:            http://bugs.php.net/fix.php?id=32414&r=dst
IIS Stability:               http://bugs.php.net/fix.php?id=32414&r=isapi
Install GNU Sed:             http://bugs.php.net/fix.php?id=32414&r=gnused
Floating point limitations:  http://bugs.php.net/fix.php?id=32414&r=float
No Zend Extensions:          http://bugs.php.net/fix.php?id=32414&r=nozend
MySQL Configuration Error:   http://bugs.php.net/fix.php?id=32414&r=mysqlcfg

Reply via email to