|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2005-03-22 17:38 UTC] 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 ); PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Fri Nov 07 19:00:02 2025 UTC |
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.No, you misunderstood me: I want to say, that problem is that session_start() ALWAYS tries to send headers. Even if all reasons for sending are eliminated by ini_set('session.use_cookies', 0) and session_cache_limiter('none'), it still tries to send empty headers, which cause bug subject warning.Nope. Use ini_set('session.use_cookies', false); to turn off cookie sending and session_cache_limiter(''); to not use ANY cache limiter, because 'none' is being sent too. Please, do not reclassify existing and already closed bugs, fill a new report if you feel that there is *really* a bug. For further questions please use support forums and mailing lists.Sorry. >session_cache_limiter(''); to not use ANY cache limiter, because 'none' is being sent too So, this is the problem? Documentation says nothing about '', only 'none' is documented.