2011-08-02 11 views
2

私はオンラインの訪問者とメンバーの数を取得するために、次のコードを持っている:ヘッダーは既に送信されました...なぜ私のコードが機能していませんか?

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サーバからのコードをテストし、それが働いていたが、私は私のホストにコードをアップロードするとき、それは私に次のようになりますエラー:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/csabi/public_html/index.php:9) in /home/csabi/public_html/track-online-users.php on line 6

答えて

4

メッセージは、session_startと呼ばれる前に、あなたのプログラムは、いくつかの出力を持っていたことを意味します。レスポンス本文の前にあるHTTPヘッダーでセッションCookieを設定する必要があるため、ブラウザには何も送信できません。

index.phptrack-online-users.phpの両方が両方のサーバーで同じである場合は、ファイルの開始時に、両方のファイル内の開口部<?phpの前に空白行のためにバイトオーダーマークを確認するなど

+0

はい、あなたは正しいです!ありがとう! index.phpファイルでは、track-online-usersはページタイトルの後にのみ含まれていました。 – Csabi

+0

しかしもう1つの質問があります。なぜ、同じスクリプトがWampサーバーのコンピュータから働いていたのですか? – Csabi

+0

@user:あなた自身のサーバーは常に出力バッファリングを使用するように設定されているかもしれません。設定を確認してください。 –

0

に代わるものとして、空白を削除すると、output bufferingを使用できます。これにより、スクリプトの最後までコンテンツがユーザーに送信されなくなります。その後flushの内容をbufferのユーザーに返します。 output bufferingを開始するには、ファイルの先頭、空白、テキスト、...の前にob_start();と入力してください。

空白を削除するのは間違いありませんが、常に知っておくと便利です。

P .:スクリプト終了前にbufferの内容をフラッシュするには、ob_flush();またはob_end_flush();(バッファリングも終了します)を使用できます。

関連する問題