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

Can't get filesize when reading file over HTTP wrapper

我尝试使用 PHP 的 wrappers 获取可通过 HTTP 访问的远程文件的文件大小,但失败了。

为了 100% 确定,让我声明:

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

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 protocol wrappers. The "Options" section explains, that though this protocol allows reading, it does not support stat() 函数文档中找到。

因此,fopen() works like a charm, while filesize() 和其他需要 stat() 才能工作的函数对于此包装器将失败。请注意,PHP 文档说,这些函数仅支持 some URL 包装器:

As of PHP 5.0.0, this function can also be used with some URL wrappers. Refer to Supported Protocols and Wrappers to determine which wrappers support stat() family of functionality.

似乎 HTTP/HTTPS wrapper 不在其中。

您可以尝试使用与此包装器一起使用的fopen()来实现自己版本的文件大小确定功能。但是,由于 fopen() 实际上打开了文件(而 filesize() 从文件系统/元数据中读取文件大小),这在我能想到的任何情况下都太过分了。并且... Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes) in... 将成为您今晚最亲密的朋友。