2012-07-22 51 views
1

我有一个PHP脚本,我用它来发送图像到移动设备的请求。在当前版本的脚本运行,并在年底前我用imagePNG()输出图像的设备,但这样做在PHP手册的例子一些阅读网上我看到这个例子:PHP - 使用fpassthru发送图像到手机图像PNG

<?php 
header("Content-Type: image/png"); 

# Generate cachefile for image, if it doesn't exist 
if(!file_exists($cachefile)) { 
    $im = generateimage();  # some code generates an image resource 
    imagepng($im, $cachefile); # store the image to cachefile 

    # don't output it like this: 
    /* imagepng($im);*/ 

    imagedestroy($im); 
} 

$fp = fopen($cachefile, 'rb'); # stream the image directly from the cachefile 
fpassthru($fp); 
exit; 
?> 

我用这个例子有一些修改,发送我的图片到手机,它工作正常,但我有一些问题,我想问: 1)这是比从文件中创建一个图像和使用imagePNG发送更有效吗?

2)也不应该使用fpassthru后立即关闭文件?

3)如果我确实使用fopen,这是否意味着该文件被锁定,意味着没有其他设备,但那个人将能够访问它的那一刻,它的流媒体?

对此事的任何意见将不胜感激。

回答

1

我认为缓存生成的图像是一个好主意,如果你有一个繁忙的网站。它肯定会节省内存和CPU周期以换取一些硬盘空间。

关于在使用fpassthru后关闭文件,当脚本终止时PHP不会关闭文件。由于下一行称为exit,因此不需要显式关闭文件。如果输出图像后出现更多问题,我建议在不再使用时关闭文件。

至于你的第三个问题,由于你没有调用flock,所以文件没有被锁定。如果一个流程开放阅读,另一个流程可以同时打开阅读。

只是最后一个提示,您可以使用函数readfile来输出文件。这样可以节省您不必拨打fopen,但内部readfilefpassthru调用相同的PHP函数php_stream_passthru,因此根据您使用哪一个函数,时间或效率几乎没有差别。

+0

非常酷:)感谢您确认我对使用fclose的想法我只是没有把握,我无法找到关于此事的任何文档。因此,如果我在服务器上有文件,使用readfile会为我节省一个必须用fopen打开文件的步骤?那么只要使用readfile,它甚至可能更有效率?我没有尝试过,所以我不知道,但会读文件流图像到移动设备。 – 2012-07-23 05:41:51

+1

关于释放资源[这里]有一些小提及(http://php.net/manual/en/language.types.resource.php)。我记得一些更具体的事情,但可能与相同规则适用的mysql连接有关。 Readfile与'fpassthru'完全相同,只是readfile不需要文件句柄(保存你的步骤),PHP会在内部打开它并按照'fpassthru'的方式将数据写入输出缓冲区。如前所述,在内部,它们都调用相同的函数,因此它们的表现完全相同。 – drew010 2012-07-23 15:38:58

+0

再次感谢:) – 2012-07-23 17:46:20