ID:               32414
 User updated by:  d dot geels at grape dot ru
 Reported By:      d dot geels at grape dot ru
 Status:           Open
 Bug Type:         Documentation problem
 Operating System: any
 PHP Version:      4.3.10, also 5
 New Comment:

The problem is that session_start() tries to send headers, but it must
not.

Try 'curl -v <url to above example>' and just call function a() at the
end, without registering shutdown function, you'll see, that
session_start() doesn't send any headers if second call to
session_cache_limiter has parameter 'none'. So, why does it complain,
when called from shutdown function? That is the bug actually.


Previous Comments:
------------------------------------------------------------------------

[2005-03-22 22:56:05] [EMAIL PROTECTED]

This is actually just documentation problem:
You can't send any headers from a register_shutdown_function()  call.
Or use any functions in such function that might send headers..such as
almost any session function.
 

------------------------------------------------------------------------

[2005-03-22 18:46:42] d dot geels at grape dot ru

Tiny example, that always reproduces the bug.

<?
ini_set('session.use_cookies', 0);
session_id('1234');
session_cache_limiter('public');
session_start();
session_write_close();
?>
text
<?
function a(){
  session_cache_limiter('none');
  session_start();
  session_write_close();
}

register_shutdown_function('a');
?>

If just call a() at the end -- no warnings, if a() called at shutdown
-- warning issued.

------------------------------------------------------------------------

[2005-03-22 17:38:57] d dot geels at grape dot ru

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 this bug report at http://bugs.php.net/?id=32414&edit=1

Reply via email to