1

以下の2つのコード例に違いがあるかどうか疑問に思っています:

$image = 'http://www.example.com/image.jpg'

$photo = file_get_contents($image);

ob_start();
header("Content-type: image/jpeg");
print($photo);
ob_end_flush(); 

また...

$image = 'http://www.example.com/image.jpg'

$photo = file_get_contents($image);

ob_start();
header("Content-type: image/jpeg");
readfile($photo);
ob_end_flush();
4

3 に答える 3

1

readfileファイル名を引数としてとることには、非常に大きな違いがあります。

2番目のスニペットは次のようになります

$image = ...
readfile($image)

これには、ファイルの内容全体をメモリ (文字列) に格納する必要がないという利点がありますreadfile。もちろん、出力をバッファリングすると、それはもはや真実ではありません。

于 2012-11-12T17:29:23.030 に答える
1

最初の例では、コードは決して機能しません

  readfile($photo);
              ^--------------- Takes file name not string 

PHPドキュメントは言う

ファイルを読み取り、出力バッファーに書き込みます。

そのイベントを再作成する必要はなく、それを他の複数の機能と複製する必要はありません。

 readfile = file_get_contents + print 

ファイル内の単純なコンテンツを取得する fopen代わりに使用するのと同じですfile_get_contents

最後readfileに、同じイメージで 10000 ループを使用してテストした方が高速です

Single Run
Array
(
    [m1] => 0.0006101131439209
    [m2] => 0.00031208992004395
)
Dual Run
Array
(
    [m1] => 3.4585757255554   
    [m2] => 2.9963381290436   <---- Faster 
)

m1&m2関数

function m1($array) {
    $photo = file_get_contents('a.png');
    ob_start();
    print($photo);
    ob_end_clean();
}

// Array clean copy
function m2($array) {
    ob_start();
    readfile('a.png');
    ob_end_clean();
}
于 2012-11-12T17:30:58.877 に答える
1

readfileのパラメータはファイル名であり、コンテンツ自体ではありません。したがって、次のように呼び出します。

$image = 'http://www.example.com/image.jpg'
ob_start();
header("Content-type: image/jpeg");
readfile($image);
ob_end_flush();

readfile一度にチャンクを読み書きするため、メモリ消費量は一定ですが、 の結果を に保存する場合はfile_get_contents$photoイメージを保存するのに十分なメモリが必要です。

あなたの場合、出力バッファリングにより、file_get_contentsバリアントは画像のサイズの2 倍のメモリを必要とします。したがって、大きな画像の場合readfile、メモリ要件が半分になります。出力バッファリングは、ダウンロードが遅れることを意味することに注意してください。他に必要がない場合は、単純に無効にすると、パフォーマンスが向上します (実際の速度とサーバーのメモリ要件の両方で)。

$image = 'http://www.example.com/image.jpg'
header("Content-type: image/jpeg");
if (@readfile($image) === false) {
   // print error image
}
于 2012-11-12T17:31:39.720 に答える