这是我需要实现的目标:
请求:http://www.example.com/image5.jpg
应该重写,例如:
RewriteRule ([^.]+)\.jpg$ /image.php?image=$1
现在,在我的image.php
中,如果我知道它在哪里,我该如何为图像提供服务?
例如:
<?php
$path = '/images/5/2/3/1/small/latest/'.$_GET['image'].'.jpg';
?>
处理此请求的最佳方法是什么,以便它的行为类似于图像文件(发送图像标题)并显示图像?
网络上有各种替代方案,主要是X-Sendfile
和readfile()
,但我不确定最佳解决方案是什么以及原因。
答案 0 :(得分:0)
假设网络服务器仍然可以通过完整路径直接提供图像,我只是直接重定向到图像:
header("Location: /images/5/2/3/1/small/latest/{$_GET['image']}.jpg");
exit;
发送标头后,exit
很不错。此外,请确保您不发送任何其他输出,因为header
将不起作用。
答案 1 :(得分:0)
执行此操作的最快方法是利用操作系统零拷贝支持,而通过告知网络驱动程序将数据直接从OS文件系统缓冲区移动到网络上来发送文件。这样,就不需要RAM处理,并且瓶颈将在您的网络带宽中。
我无法提及PHP支持这一点,但是,这意味着如果必须使用PHP提供文件,则必须将文件从OS文件缓存复制到PHP内存空间,并且然后请PHP让驱动程序复制它。
我认为这样做的内置方法将是最有效的方法:http://php.net/manual/en/function.http-send-file.php