已经发送的标题...为什么我的代码不起作用?

时间:2011-08-02 07:58:26

标签: php session

我有以下代码来获取在线访问者和成员的数量:

session_save_path($_SERVER['DOCUMENT_ROOT'] . '/sessions/' . (isset($_COOKIE['uid']) ? "members/" : "guests/"));
if(isset($_COOKIE['uid'])){
    session_id($_COOKIE['uid']);
}
session_start();
define("MAX_IDLE_TIME", 15);
$online_guests = 0;
$directory = opendir($_SERVER['DOCUMENT_ROOT'] . '/sessions/guests/');
while(false !== ($file = readdir($directory))){
    $online_guests++;
}
$online_guests -= 2;
$online_members = array();
$directory = opendir($_SERVER['DOCUMENT_ROOT'] . '/sessions/members/');
while(false !== ($file = readdir($directory))){
    if($file != '.' && $file != '..'){
        $online_members[] = intval(substr($file,5));
    }
}

我测试了我的wamp服务器中的代码并且它有效,但是当我将代码上传到我的主机时,它给了我以下错误:

  

警告:session_start()[function.session-start]:无法发送会话cookie - 已经在/ home / csabi / public_html /中发送的输出(/home/csabi/public_html/index.php:9中的输出开始)第6行的track-online-users.php

2 个答案:

答案 0 :(得分:4)

该消息表示您的程序在调用session_start之前有一些输出。在此之前,您无法向浏览器发送任何内容,因为设置会话cookie必须在响应正文之前的HTTP标头中进行。

如果两个服务器上的index.phptrack-online-users.php都相同,请检查两个文件中打开<?php之前的空行,文件开头的字节顺序标记等等。

答案 1 :(得分:0)

作为删除任何空格的替代方法,...您可以使用output buffering。这将停止发送给用户的任何内容,直到它到达脚本的末尾。然后,flushbuffer的内容发送给用户。要开始output buffering,只需在文件开头写ob_start();,然后在任何空格,文字,...

之前

并不是删除任何空格是错误的,但知道它总是有用的。

PS:要在脚本结束前刷新buffer的内容,您可以使用ob_flush();ob_end_flush();(这也将结束缓冲)。