【问题标题】:file_put_contents() and flock() error 'out of free disk space 'file_put_contents() 和flock() 错误“可用磁盘空间不足”
【发布时间】:2016-03-09 17:09:15
【问题描述】:

我运行这个测试脚本

<?php
function LockData($file,$locker=LOCK_EX){
    static $streams=array();
    $md=md5($file);

    if(empty($streams[$md])){
        $streams[$md]=fopen($file,'a+');
    }
    $i=0;
    do{
        $lock=flock($streams[$md],$locker);
    }while(!$lock && ++$i<=3);

    return $lock;
}

function ReadData($file){
    if(is_file($file)){
        $lock=LockData($file);
        if(!$lock) return false;

        $data=@file_get_contents($file);

        if(!empty($data)){
            return unserialize(str_replace('<?die;?>',"",$data));
        }
    }
    return false;
}

function WriteData($file,$data){
    file_put_contents($file,'<?die;?>'.serialize($data));

    LockData($file,LOCK_UN);
}

$fp=ReadData($file="test.txt");

if(!$fp)$fp=array();
print_r($fp);
$fp[]="2";
WriteData($file,$fp);

如果我使用 LockData() 函数,则会出现错误“警告:file_put_contents() [function.file-put-contents]:仅写入 26 个字节中的 0 个,可能已用完可用磁盘空间” 不明白这个...

【问题讨论】:

  • 那么,有多少可用硬盘空间?
  • 120 GB...而且只有当我使用 LockData()/flock 时才会显示此错误
  • 我没有看到 file_put_contents()LockData() 中的使用位置,您确定这是警告的来源吗?
  • 如果我从WriteData()ReadData() 中删除LockData() 函数,一切正常...平台windows 7,在Linux 上一切正常...

标签: php


【解决方案1】:

问题出现在 Windows 中,因为 win 下的 flock() 使用阻塞作为“每个文件处理程序”,但在 Linux 下它作为“每个进程”工作。 所以,在一个脚本中我有两个 fopen()。第一个在 LockData() 中,第二个在 file_put_contents() 中,第二个不能将数据写入文件,因为文件处理程序被锁定(在 Win 下)。

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 1970-01-01
    • 2012-11-15
    • 2016-06-08
    • 2013-10-09
    • 2015-12-04
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多