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

时间:2013-12-12 20:55:30

标签: php linux filesystems debian selinux

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

使用以下代码:

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

稍后在脚本中,打开同一个文件进行阅读:

$content = file_get_contents($file);

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

任何日志文件(审计,php等)都没有错误。将clearstatcache()置于file_get_contents()之上或使用file_put_contents()中的LOCK_EX锁定该文件无济于事。脚本与同一文件名并行访问。 Apache也可以在没有PHP的情况下直接返回现有的缓存图像。

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

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

2 个答案:

答案 0 :(得分:1)

遇到此问题,发现如果文件名包含不允许的字符并且无效,则会导致此问题。

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

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

Filename practice

答案 1 :(得分:-1)

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