2013年3月編集:
この応答は、大きなファイルには従うべきではありません。ゲームには新しいプレーヤーがあります: https://github.com/igorw/IgorwFileServeBundle
SendFile をサポートして、ファイルのダウンロードを Apache/Ngnix に委任します。これははるかに優れています。
編集2013年5月:
すばらしいニュース: ビルドイン ソリューションがコアで利用できるようになりました: BinaryFileResponse。
古い応答:
という名前の新しい Response クラスがありStreamedResponse
ます。これはまさにあなたがしようとしていることを実行しますが、よりメモリ効率が良く、カーネルによって適切に処理されます。
StreamedResponse は、ストリーミングされた HTTP 応答を表します。
StreamedResponse は、そのコンテンツにコールバックを使用します。
コールバックは、echo などの標準の PHP 関数を使用して、応答をクライアントにストリーミングする必要があります。必要に応じて、flush() メソッドも使用できます。
http://symfony.com/doc/master/components/http_foundation/introduction.html#streaming-a-response
したがって、大きなファイルの場合は、file_get_content なしで実行できます。
<?php
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
$response = new StreamedResponse();
$response->setCallback(function () {
$name = 'bigfile.pdf';
$fp = fopen($name, 'rb');
fpassthru($fp);
});
$d = $response->headers->makeDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'foo.pdf');
$response->headers->set('Content-Disposition', $d);
$response->send();