ID: 32414 User updated by: d dot geels at grape dot ru Reported By: d dot geels at grape dot ru -Status: Feedback +Status: Open Bug Type: Session related Operating System: any PHP Version: 4.3.10, also 5 New Comment:
No, we don't use this at all, this option is always set to 0. Just checked, ini option is set to 0, .htaccess doesn't change this option. Previous Comments: ------------------------------------------------------------------------ [2005-03-22 18:34:23] [EMAIL PROTECTED] Do you have 'session.auto_start' set on somewhere? (httpd.conf, .htaccess file, php.ini..) ------------------------------------------------------------------------ [2005-03-22 18:25:12] d dot geels at grape dot ru There is one more detail, I forgot to mention: I couldn't kill warning message by calling @start_session() in line 45. Is this because of warning message issued somewhere in calls from session_start()? ------------------------------------------------------------------------ [2005-03-22 18:16:04] d dot geels at grape dot ru Just viewd latest session.c from CVS repository. There are not much changes between versions 4 and 5, so bug still remains in PHP 5. Somewhere here: static int php_session_cache_limiter(TSRMLS_D) { php_session_cache_limiter_t *lim; // for some reason, this string fails if (PS(cache_limiter)[0] == '\0') return 0; // I cant understand all this file, but I think, problem is // that value 'none' is not properly recognized or processed if (SG(headers_sent)) { char *output_start_filename = php_get_output_start_filename(TSRMLS_C); int output_start_lineno = php_get_output_start_lineno(TSRMLS_C); if (output_start_filename) { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent (output started at %s:%d)", output_start_filename, output_start_lineno); } else { php_error_docref(NULL TSRMLS_CC, E_WARNING, "Cannot send session cache limiter - headers already sent"); } return -2; } for (lim = php_session_cache_limiters; lim->name; lim++) { if (!strcasecmp(lim->name, PS(cache_limiter))) { lim->func(TSRMLS_C); return 0; } } return -1; } ------------------------------------------------------------------------ [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