2016-11-22 6 views
4

大規模なzipファイル(2,663,439,370バイト)をダウンロードするスクリプトをPHPで作成しようとしていますが、面倒で面倒な問題に遭遇しました。スクリプトは最初の2.147.483.647バイトをダウンロードしてからファイルをダウンロードしますバイト番号2.147.483.648,2.147.483.649などを付加すると、バイト番号1から始まるファイルにバイトを追加し続けます。2Gbを超えるファイルをPHPでダウンロードするにはどうすればよいですか?

したがって、ダウンロードされるファイルは、バイト1、バイト2、 ...バイト2.147.483.647、バイト1、バイト2 ...など。

私は、2.147.483.647が32バイトシステムが格納できる最大整数値であることに気付きました。しかし、私のサーバーは64バイトのシステムで、それ以上の値を格納することができます。これを証明するために、var_dump((int)2147483648)は正しい整数を返します。

マイダウンロード・スクリプトは、できるだけ正しい(コピー&ペーストでphp.netから取られる)され

header('Content-Description: File Transfer'); 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="Certificat.zip"'); 
header('Expires: 0'); 
header('Cache-Control: must-revalidate'); 
header('Pragma: public'); 
header('Content-Length: ' . filesize($zipname));  

readfile($zipname); 

誰もがこの問題に遭遇していますか?

+0

PHPにいくつかのソフトリミットが設定されているようですか? –

+1

あなたのシステムは64ビットかもしれませんが、あなたのPHPはそうではないようです。 ['9223372036854775807'](https://en.wikipedia.org/wiki/9223372036854775807) – MonkeyZeus

+1

で64ビットintが先頭になります。サーバーにフルアクセスしてApacheであれば、[mod_xsendfile]をチェックアウトしてください – MonkeyZeus

答えて

0

readfile()機能を削除し、自分自身の内容をfopen()fread()を使用して出力することで問題を解決しました。

しかし、このような大きなファイルを扱うときには、readfile() 'が失敗する理由は未解決のままです(私はphp.netのドキュメントを読みましたが、そのような問題についてのメモは見つかりませんでした)。だから私はまだ経験豊富なプログラマーが私を啓発するのを待っている:)。

0

私は現在進行中のストリームからロードされたとき、私はこの数回やった私は、それはあなたのケースで役立つことがしたいかどうかわからないんだけど、あなたは header('Content-Length: ' . filesize($zipname)); を削除する必要がありますスクリプトはcontent.Iで応答を停止するまで、ブラウザは読み込みを継続この大きなファイルではうまく動作しないかもしれませんが、PHPの制限になる可能性があります。

+1

これにより、ブラウザからファイルサイズが隠されているだけで、ダウンロード時間は見積もることができませんでしたが、結果は同じでした。 –

1

5.6ソースを読むと、readfileは​​を返します。 Here's the source reference。もう少し掘り

、それ私達にあなたの関数がで停止し、整数の署名最大値を与え、通常 4バイトであるlong intの定義と、このマクロ取引と思われます。私はこれより深くは掘り下げなかった、これは私の前提であり、あなたが経験している行動を考えれば、これは私のためには十分であろう。

一方、私は個人的にはreadfileを使用していませんでしたが、fopen/freadのコンボは、パフォーマンスと使用メモリの点で常に優れています。あなたはチャンクを読むことができるので、2GBのマンモスを拾うのではなく、単にサーバリソース上で簡単です。

関連する問題