1

我有一个 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 是否意味着文件被锁定意味着没有其他设备,但在那一刻能够访问它被流式传输?

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

4

1 回答 1

1

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

关于使用后关闭文件fpassthru,这是不必要的,因为 PHP 会在脚本终止时关闭文件。由于下一行调用exit,因此无需显式关闭文件。如果输出图像后还有更多事情发生,我建议在不再使用时关闭文件。

至于你的第三个问题,因为你没有调用flock,所以文件没有被锁定。如果一个进程将其打开以供阅读,则另一个进程可以同时将其打开以供阅读。

最后一点,您可以使用函数readfile来输出文件。这使您不必调用fopen,但在内部readfile调用fpassthru相同的 PHP 函数php_stream_passthru,因此根据您使用的函数,时间或效率几乎没有差异。

于 2012-07-23T04:48:40.807 回答