[PHP-users 28491] Re: header やreadfileを実行するとそのページが2〜3回実行される

FELLOW 大山 ohyama @ fellow-inc.co.jp
2006年 2月 20日 (月) 13:32:24 JST


nomoto様

大山です。

アドバイスありがとうございます。

>> いろいろ試した結果、header関数やreadfile関数を一度でも実行すると
>> 現象が発生します。
>という現象と食い違っています。
これはあくまで私の作成したソース内での結果です。
すみません、説明不足で。。。

Windows COMで作成されたソース等は残念ながら公開する
わけにはいかず簡単にはまとめられません。
その前後の部分は全く同じソースになっています。
また
<?php
session_start();
if (isset($_SESSION['count'])) {
  if ($_SESSION['count'] >= 99) {
    $_SESSION['count'] = 1;
  } else {
    $_SESSION['count'] ++;
  }
} else {
  $_SESSION['count'] = 1;
}

$fname = "./tts_" . $_SESSION['count'] . ".wav";

// ここからWindows COMのプログラム
// ここでWAVファイルを作成します。
  ・
  ・
  ・
までのソースで実行する分には1回しか実行されていません。

その先の
if (file_exists($fname)) {
  header("Content-Type: audio/x-ms-wma");
  header("Content-Disposition: inline; filename=./" . $fname);
  header ("Content-Length: " . filesize($fname));
  set_time_limit(0);
  @readfile($fname);
  unlink($fname);
}
を含めると2〜3回実行されてしまいます。

またheader("Content-Type: audio/x-ms-wma");だけを実行して
その後をコメントにしても2〜3回実行されてしまいます。
例)
if (file_exists($fname)) {
  header("Content-Type: audio/x-ms-wma");
//  header("Content-Disposition: inline; filename=./" . $fname);
//  header ("Content-Length: " . filesize($fname));
//  set_time_limit(0);
//  @readfile($fname);
//  unlink($fname);
}

同じく@readfile($fname);だだけを実行して
その前後をコメントにしても2〜3回実行されてしまいます。
例)
if (file_exists($fname)) {
//  header("Content-Type: audio/x-ms-wma");
//  header("Content-Disposition: inline; filename=./" . $fname);
//  header ("Content-Length: " . filesize($fname));
//  set_time_limit(0);
  @readfile($fname);
//  unlink($fname);
}

※上記の2つの例のソースはどちらもsession_start();〜を含みます。

header関数にキャッシュ関係のコードを追加しても実行してもだめでした。
例)
header("Cache-Control: public");
header("Pragma: public");

↑はあまり意味が無いかもしれませんが。。。

以上です。
宜しくお願い致します。


>>> <?php
>>> header( "Content-Type: text/plain");
>>> readfile( __FILE__);
>>> ?>
>>
>>を実行してみたところ、1回しか実行されていないようです。。。
>
>という事は、大山様のおっしゃる
>> いろいろ試した結果、header関数やreadfile関数を一度でも実行すると
>> 現象が発生します。
>という現象と食い違っています。
>
>・・という事は、原因はheader関数やreadfile関数ではなく
>そのソースの他の箇所にあるという事になると思います。
>
>原因の特定のためには、問題を起こしているソースをあちこち省略して
>「2〜3回実行されてしまうという現象が再現できる最小のソース」を
>作ってみてください。それがデバッグの一番の近道です。
>
>その過程で別な原因が見つかるかも知れませんし、最小のソース
>であれば他の方へそのまま提示してアドバイスをもらいやすいと
>思います。





PHP-users メーリングリストの案内