通过 HTTP 包装器读取文件时无法获取文件大小
Can't get filesize when reading file over HTTP wrapper
我尝试使用 PHP 的 wrappers 获取可通过 HTTP 访问的远程文件的文件大小,但失败了。
为了 100% 确定,让我声明:
- 文件存在,
ini_get('allow_url_fopen')
returns 1
,
stream_get_wrappers()
returnshttp
就行了
var_dump(fopen($filename))
returns 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 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...
将成为您今晚最亲密的朋友。
我尝试使用 PHP 的 wrappers 获取可通过 HTTP 访问的远程文件的文件大小,但失败了。
为了 100% 确定,让我声明:
- 文件存在,
ini_get('allow_url_fopen')
returns1
,stream_get_wrappers()
returnshttp
就行了var_dump(fopen($filename))
returnsresource(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 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...
将成为您今晚最亲密的朋友。