当前位置: 首页 > 知识库问答 >
问题:

PHP的file_get_contents()有时返回零字节/false

池照
2023-03-14

我们构建一个PHP脚本来缓存服务器硬盘驱动器(ext4)上的图像(Debian Wheezy with SELinux, Apache, PHP 5.3.26)。

使用类似于以下代码的代码:

$data = "...";
$file = "cached_foo_1234.jpg"; 
if (!is_file($file)) file_put_contents($file, $data);

在脚本的后面,将打开相同的文件进行读取:

$content = file_get_contents($file);

尽管硬盘上有正确的数据,但有时$content在文件写入文件系统时是空的。函数filesize()显示了相同的行为。

任何日志文件(审计、php等)中都没有错误。将clearstatcache()放在文件\u get\u contents()的顶部,或在文件\u put\u contents()中使用LOCK\u EX锁定该文件都没有帮助。使用相同的文件名多次并行访问脚本。Apache也直接返回现有的缓存图像,而不使用PHP。

我想文件锁定应该避免在写入文件时返回空值。

当我们试图从文件系统读取文件时,为什么会得到零字节?

共有2个答案

南门洋
2023-03-14

使用curl,并检查忽略以验证SSL:curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,false);

皇甫文乐
2023-03-14

遇到此问题并发现它是由于文件名包含不允许的字符而变得无效引起的。

要删除无效的文件名字符,请使用:

$bad = array_merge(
    array_map('chr', range(0,31)),
    array("<", ">", ":", '"', "/", "\\", "|", "?", "*"));
$result = str_replace($bad, "", $filename);

文件名实践

 类似资料:
  • 问题内容: 我犹豫要问这个问题,因为它看起来很奇怪。但不管怎么说。以防万一有人已经遇到了相同的问题…文件系统功能(fopem,file,file_get_contents)对于http://包装器表现得很奇怪 它似乎有效。 没有提出错误 。fopen()返回资源。 它不会为所有肯定有效的网址返回任何数据(例如)。 文件返回空数组,file_get_contents()返回空字符串,fread返回f

  • 问题内容: 我正在尝试制作Sitecraper。我是在本地计算机上制作的,在那儿工作得很好。当我在服务器上执行相同操作时,它显示403禁止错误。我正在使用PHP简单HTML DOM解析器 。我在服务器上收到的错误是这样的: 警告:file_get_contents(http://example.com/viewProperty.html?id=7715888)[function.file- get

  • 问题内容: 我知道read()是一个阻塞调用,除非我使套接字成为非阻塞。因此,我希望请求4K数据的read()调用应返回正值(读取的字节数)或错误时返回-1(客户端可能重置连接等)。我的问题是:在任何情况下read()都可以返回“ 0”吗? 我这样处理read(): 如果read()返回零,则此代码炸弹轰炸,我知道如何修复它。但是read()是否有可能返回零? 问题答案: 当一侧的TCP连接关闭时

  • 问题内容: 我在从PHP代码调用URL时遇到问题。我需要使用我的PHP代码中的查询字符串来调用服务。如果我在浏览器中键入该URL,就可以正常工作,但是如果我使用file- get-contents()进行调用,则会得到: 警告:file-get-contents(http:// ....)无法打开流:HTTP请求失败!HTTP / 1.1 202在…中接受 我使用的代码是: 就像我说的那样-从浏览

  • 我一直在尝试在我的应用程序中实现GMAIL API,该应用程序是使用Swift5和Xcode构建的。我已经成功地检索到来自用户的电子邮件,但我无法从编码字符串中获得实际的文本。每当我尝试将这个base64编码的数据转换为普通字符串时,它都返回NIL。 这是绳子 stackoverflow的一些答案建议向string添加填充,但这也不起作用。

  • 问题内容: 访问REST API时,这两段代码有何不同? 和 从以下两个方面判断,它们都产生相同的结果 问题答案: 是一个简单的螺丝刀。非常适合简单的GET请求,其中标头,HTTP请求方法,超时,cookiejar,重定向和其他重要内容无关紧要。 带有流上下文或带有setopt的cURL 的Powerdrill带有您可以想到的每一个细节。