2011-06-24 20 views
0

私はphpダウンロードスクリプトでreadfile()を使用しています。定義されたデータ型の値が大きすぎます

私は9ギガバイトのサイズのファイルをダウンロードしようとすると、私は次のエラーを取得する:

function.readfile</a>]: failed to open stream: Value too large for defined data type in path of my file 

は、それはそれを修正することは可能ですか私はpublic_htmlディレクトリにそれらのファイルを移動し、それらを直接リンクすることがありますか?

+1

すごいを記述する必要はありませんよう

passthru('cat $filename');

を行うことができますか?仕事のために多分間違ったツール〜? – Shad

+1

@Shad //それ以上に同意できませんが、何ができますか.iはそれを修正する必要があります – Moon

+0

@Shad // um ..まあ...それは実際には解析されていません。それは読んでいる*と送信 – Moon

答えて

2

あなたがが道をハックすることができます。あなたがUNIX環境にある場合、あなたは限り、あなたはPHPで9ギガバイトを解析し、

+0

@Jermy Walton //完璧に動作します! – Moon

+0

@Jermy Walton //もう1つの質問... @ Shadが暗示しているように、私はサーバーメモリについて心配しています。 catコマンドでパススルーを使用してファイルをダウンロードしても問題ありませんか? Apacheサーバ経由でファイルをダウンロードするのはどのように違いますか? – Moon

+0

stdin/stdoutバッファは固定長であるため、メモリについては心配する必要はありません。猫が一度それを埋めると、PHPがもっと送るためにある程度の時間がかかるまで待たなければなりません。ファイルは完全にメモリに格納されていません。これは、常に処理したいことではありません。これを処理するプロセスを生成することは費用がかかります。 apacheサーバから直接送信するのとは異なる点は、apacheがphpよりも速く、より少ないオーバーヘッドでファイルを送信するためです。可能であれば、まずファイルをapache経由で送信してください。 – Rahly

2

PHPが大容量ファイルを処理できるように、おそらくPHPをCFLAGS="-D_FILE_OFFSET_BITS=64"で再コンパイルする必要があります。 fopen documentation pageのコメントがあります。

いくつかの追加の読書:

+0

Descornces //答えをありがとう。他の方法はありますか? php.iniは変更できますが、再コンパイルはオプションではありません。また、php.netのBrad Gは、CFLAGSが問題を引き起こす可能性があると述べています。 http://ca3.php.net/manual/en/function.fopen.php#37791 – Moon

+0

@ムーン - それは正しいです。残念ながら、私が気づいている方法は他にありません。私は似たような問題にぶつかりました(大きなフラットファイルデータベースを除いて)。 –

+0

@FrancoisDeschenesは、リポジトリからインストールする場合、これを修正する簡単な方法はありますか?ゼロからコンパイルするのと反対ですか? – Chris

関連する問題