这是我需要实现的:
请求: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()
,但我不确定什么是最佳解决方案以及为什么。
假设 Web 服务器仍然可以通过完整路径直接提供图像,我只会直接重定向到图像:
header("Location: /images/5/2/3/1/small/latest/{$_GET['image']}.jpg");
exit;
发送标头后最好使用该exit
。另外,请确保您不发送任何其他输出,因为那时header
将不起作用。
执行此操作的
最快方法是利用操作系统零拷贝支持,而文件是通过告诉网络驱动程序将数据直接从操作系统文件系统缓冲区移动到网络上来发送的。这样,就不需要RAM复制,瓶颈将出现在您的网络带宽中。
但是,我找不到任何提及PHP支持此功能的内容,这意味着如果您必须使用PHP提供文件,则必须将文件从操作系统文件缓存复制到PHP的内存空间中,然后让PHP要求驱动程序复制它。
我认为这样做的内置方法将是最有效的方法:http://php.net/manual/en/function.http-send-file.php