2016-07-17 7 views
3

現在、私は次のようなスクリプトを持っている:PHPのcURLリアルタイムプロキシ(ストリームファイル)

<?php 
$filename = "http://someurl.com/file.ext"; 
header('Content-Type: application/octet-stream'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$filename); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 500); 
$data=curl_exec($ch); 
curl_close($ch); 
echo $data; 
?> 

問題は、サーバーだけで、ファイル全体をダウンロードした後に応答を送信することです。私はそれが "ストリーム"のように動作し、ファイルがダウンロードされている間に応答としてデータのチャンクを送りたいと思っています。

PHPとcURLで実現することは可能ですか?

+0

[This](http://mtdowling.com/blog/2012/01/27/chunked-encoding-in-php-with-guzzle/)があなたが探しているものかもしれません。 –

+0

私は以前にコンポーザーを使ったことがなく、私は共有ホスティングに入っていますが、私はそれについてさらに検索します。 – kekit

答えて

5

可能です。 curlオプションCURLOPT_WRITEFUNCTIONを使用して、データのまとまりを受け取るコールバックを指定して、カールがファイルをダウンロードしたときにクライアントに直接送信できるようにすることができます。

<?php 

$filename = "http://someurl.com/file.ext"; 
header('Content-Type: application/octet-stream'); 
header('Content-Disposition: attachment; filename="' . basename($filename) . '"'); 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL,$filename); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 500); 
curl_setopt($ch, CURLOPT_WRITEFUNCTION, function($curl, $data) { 
    echo $data; 
    return strlen($data); 
}); 
curl_exec($ch); 
curl_close($ch); 
+0

5 MBのファイルでテストしました。ちょうど徐々にchuncksを送信するのではなく、私はそれがすでに転送されたデータを何度も送信するか、何らかの方法で破損していると信じています。これには特定のPHPバージョンが必要ですか? – kekit

+0

write関数は、同じデータを2回受け取るべきではありません。匿名関数をCURLOPT_WRITEFUNCTIONに提供できるようにするには、最小PHPバージョンは5.3です。それ以外の要件はありません。私は5 MBから480 MBまで様々なファイルを使って再試行しました。すぐにコンピュータでダウンロードが始まり、ファイルのチェックサムが一致して正常に開かれました。 – drew010

+0

私はついにこの問題を発見しました。これはcloudflareによって引き起こされました...コードは期待通りに機能します。ありがとうございました。 – kekit