我尝试使用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...
将是你今晚最亲密的朋友。