1

只是想知道以下两个代码示例是否有任何区别:

$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将文件名作为参数有一个非常显着的区别。

第二个片段应该类似于

$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变体需要两倍于图像大小的内存。因此,对于大图像,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 回答