我有一个php脚本,我可以根据请求将图像发送到移动设备。在当前版本中脚本运行,在结束之前我使用imagePNG()将图像输出到设备,但是在php手册中的示例中做了一些阅读,我看到了这个例子:
<?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那是否意味着该文件被锁定意味着没有其他设备,但是那个人能够访问它的那一刻它被流式传输?
对此事的任何意见都将不胜感激。
答案 0 :(得分:1)
我认为如果你有一个繁忙的网站,缓存生成的图像是个好主意。它肯定会节省内存和CPU周期,以换取一些硬盘空间。
关于在使用fpassthru
后关闭文件,没有必要,因为PHP会在脚本终止时关闭文件。由于下一行调用exit
,因此无需显式关闭该文件。如果输出图像后还有更多内容,我建议在不再使用时关闭文件。
关于您的第三个问题,由于您尚未调用flock,因此该文件未被锁定。如果一个进程打开它进行读取,另一个进程可以打开它以便同时读取。
最后一点,您可以使用函数readfile输出文件。这样您就不必调用fopen
,但在内部,readfile
和fpassthru
调用相同的PHP函数php_stream_passthru
,因此基于哪个时间或效率几乎没有差异你使用的一个。