我有一个 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,这是否意味着该文件已被锁定,意味着没有其他设备可以在流式传输的那一刻访问它?
如有任何意见,我们将不胜感激。
最佳答案
我认为如果您的站点很忙,缓存生成的图像是个好主意。它肯定会节省内存和 CPU 周期,以换取一些硬盘空间。
关于在使用 fpassthru
后关闭文件,这是不必要的,因为 PHP 会在脚本终止时关闭文件。由于下一行调用了 exit
,因此无需显式关闭文件。如果在输出图像后还有更多操作,我建议在不再使用时关闭文件。
至于你的第三个问题,因为你没有调用flock ,文件未锁定。如果一个进程打开它进行读取,则另一个进程可以同时打开它进行读取。
最后一点,您可以使用函数 readfile输出文件。这使您不必调用 fopen
,但在内部,readfile
和 fpassthru
调用相同的 PHP 函数 php_stream_passthru
因此根据您使用的是哪个,在时间或效率上几乎没有差异。
关于PHP - 使用 fpassthru 通过 imagePNG 将图像发送到移动设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604202/