2012-09-02 68 views
5

基本上,我想向浏览器发送一个头文件X-Sendfile来发送文件,但是如果X-Sendfile不可用或者未安装在服务器上,我不想调用它。我如何检查这在PHP?或者,如果这不可能在PHP中检查,而不是如何检查它是否安装PERIOD?我宁愿检查PHP中是否存在X-Sendfile,因为这样做对我来说会更容易,因为这是可以在其他站点和服务器上运行的包的一部分......也许如果我只是使用它与PHP header函数,它会返回一些东西,如果没有安装??PHP - 如何确定X-Sendfile是否可用并已安装?

谢谢你们:)

回答

6

的Apache模块mod_xsendfile过程头

要检查Apache模块mod_xsendfile可用,并且安装在服务器上,你可以使用apache_get_modules()功能。

您不能只设置标题并检查模块是否安装。

+0

保存你的“谢谢”给别人。我非常乐意帮助你。 – verisimilitude

+3

不要忘记:模块可能会被加载(列在apache_get_modules()中,但可能不会被启用(它甚至在默认情况下被禁用)。您不能使用PHP来检查这个模块。 – marcovtwout

0

试试这个:

if (in_array('mod_xsendfile', apache_get_modules())) { 
     header("X-Sendfile: $file"); 
    } else { 
     error_log("Warning! mod-xsendfile is NOT INSTALLED - sending file the old fashion way....."); 
     header('Content-Length: ' . filesize($file)); 
     print file_get_contents($file); 
    } 
+0

为什么不使用readfile旧时尚方式“? –

+2

xsendfile将退出PHP并释放内存,并允许apache使用DMA /硬件加速发送文件。如果使用readfile,您将数据通过多个缓冲区并复制到内存中(PHP将文件读入内存 - > php输出缓冲区 - > apache输出缓冲区 - >网络缓冲区)所有这些都是在处理器中完成的,而不是sendfile(apache告诉Harddrive使用DMA直接将文件加载到内存中,apache通知网卡通过读取发送数据直接从内存中,处理器可以自由地做其他事情而不是不必要的内存拷贝) – RobertMaysJr

+0

我不是在辩论xsendfile的优点,而是以“旧时尚的方式”打印。即使回声比打印快,第二个读取文件比两者都要快,特别是如果您必须先回调file_get_contents才能回显它。 –

0

这是不正确的。如果相关位置的XSendFile未设置为On,但该模块已加载,则会错误地假定xsendfile的用法可用,尽管不是。

相关问题