通过HTTP包装器读取文件时无法获取filesize


Can't get filesize when reading file over HTTP wrapper

我尝试使用PHP的包装器获取通过HTTP访问的远程文件的filessize失败了。

为了百分百确定,让我声明:

  • 文件存在,
  • ini_get('allow_url_fopen')返回1
  • stream_get_wrappers()返回列表中的http
  • var_dump(fopen($filename))返回resource(119) of type (stream)

这意味着远程文件是可访问的。然而,我得到:

file_exists($filename): bool(false)
is_file($filename): bool(false)
is_writable($filename): bool(false)
is_readable($filename): bool(false)

并且尝试调用filesize($filename)filesize(): stat failed for...错误结束。

我错过了什么?

答案可以在PHP的HTTP/HTTPS协议包装器文档中找到。"选项"一节解释说,虽然该协议允许读取,但它不支持stat()功能。

因此,fopen()工作得很好,而filesize()和其他需要stat()才能工作的函数在这个包装器中失败了。注意,PHP文档中说,这些函数只支持一些 URL包装器:

从PHP 5.0.0开始,这个函数也可以与一些URL包装器一起使用。参考支持的协议和包装器来确定哪些包装器支持stat()系列的功能。

看来,HTTP/HTTPS包装器不在其中。

您可以尝试使用fopen(),它与这个包装器一起工作,来实现自己版本的文件大小决定函数。但是,由于fopen()实际上打开文件(而filesize()从文件系统/元数据读取文件大小),这在任何情况下都是一个真正的过度杀伤,我可以想到。和…Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes) in...将是你今晚最亲密的朋友。