私はこのエラーの背後にある理論を知っていますが、今また私を夢中にさせています。アプリケーションでTonicを使用しています。このライブラリを使用すると、すべてのトラフィックをdispatch.php
スクリプトにリダイレクトし、スクリプトは適切な を実行し、によって表示 (出力) されるResource
をResource
返します。Response
dispatch.php
の出力方法は次のResponse
ようになります。
/**
* Output the response
*/
public function output()
{
foreach ($this->headers as $name => $value) {
header($name.': '.$value, true, $this->responseCode());
}
echo $this->body;
}
知る限り、これは、.php の出力に何も書き込めないことを示していますResource
。
Resource
入力 csv から動的に csv を生成し、それをブラウザーに出力する (データの 1 列を別の形式に変換する) があります。
$csv = fopen('php://output', 'w');
// sets header
$response->__set('contentDisposition:', 'attachment; filename="' . $fileName . '"');
while (($line = fgetcsv($filePointer, 0, ",", '"')) !== FALSE) {
// generate line
fputcsv($csv, $line);
}
fclose($filePointer);
return $response;
これは 100% 正常に動作します。ヘッダーに問題はなく、正しいファイルが生成され、ダウンロード用に提供されます。ヘッダーが設定される前に出力に書き込んでいるので、これはすでに混乱していますか? fputcsv は実際に何をしますか?
同様のことを行う 2 番目のリソースがありますが、カスタム ファイル形式 (テキスト ファイル) を出力します。
$output = fopen('php://output', 'w');
// sets header
$response->__set('contentDisposition:', 'attachment; filename="' . $fileName . '"');
while (($line = fgetcsv($filePointer, 0, ",", '"')) !== FALSE) {
// generate a record (multiple lines) not shown / snipped
fwrite($output, $record);
}
fclose($filePointer);
return $response;
唯一の違いは、fputcsv と bang の代わりに fwrite を使用することです。
headers already sent by... // line number = fwrite()
これは非常に紛らわしいです!私見は、実際には両方の場合に失敗するはずですか?最初のものはなぜ機能するのですか?どうすれば2番目のものを機能させることができますか? (ファイルを含む巨大な文字列を生成し、それを応答本文に入れることができます。ただし、ファイルはかなり大きくなる可能性があり(最大50 mb)、これを避けたいと考えています。)