我尝试使用PHP wrappers获取可通过HTTP访问的远程文件的文件大小失败。
为了100%确定,让我说明一下:
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...
错误结束。
我错过了什么?
答案 0 :(得分:1)
答案可以在PHP HTTP/HTTPS protocol wrappers的文档中找到。 " Options"部分解释说,尽管此协议允许阅读,但它不支持stat()
功能。
因此,fopen()
就像一个魅力,而filesize()
和其他需要stat()
工作的函数,对于这个包装器来说是失败的。请注意,PHP文档说,这些函数仅支持 某些 URL包装器:
从PHP 5.0.0开始,此函数也可以与某些URL包装器一起使用。 Refer to Supported Protocols和Wrappers确定哪些包装器支持stat()系列功能。
似乎,HTTP / HTTPS包装器不在其中。
您可以尝试使用与此包装器一起使用的fopen()
来实现自己版本的文件大小确定功能。但是,由于fopen()
实际上打开了文件(而filesize()
从文件系统/元数据中读取文件大小),所以在任何情况下,这都是一个真正的过度杀戮,我能想到。并且...... Allowed memory size of XXX bytes exhausted (tried to allocate YYY bytes) in...
将成为你最亲密的朋友。