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

问题描述 投票:2回答:2

[我们构建了一个PHP脚本来将图像缓存在服务器的硬盘驱动器(ext4)上(带有SELinux的Debian Wheezy,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()放在file_get_contents()顶部,或在file_put_contents()中使用LOCK_EX锁定文件无济于事。使用相同的文件名可以并行访问很多脚本。 Apache也可以直接返回现有的缓存映像,而无需PHP。

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

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

php linux filesystems debian selinux
2个回答
1
投票

解决此问题,发现它是由于文件名包含不允许的字符而变得无效。

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

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

Filename practice


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.