2

我们构建了一个 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() 放在 file_get_contents() 之上或在 file_put_contents() 中使用 LOCK_EX 锁定文件无济于事。该脚本以相同的文件名并行访问。Apache 也无需 PHP 直接返回现有的缓存图像。

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

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

4

2 回答 2

1

遇到这个问题,发现是因为文件名中包含不允许的字符而导致无效。

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

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

文件名练习

于 2015-06-21T19:45:40.950 回答
-1

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

于 2020-04-13T23:55:14.117 回答