共享访问:如何解决“ fread():长度参数必须大于0”的问题?

时间:2019-10-09 12:52:29

标签: php fread filesize flock

当我在多个脚本上运行此功能时,一个脚本会生成警告: fread():Length参数必须大于0

function test($n){
  echo "<h4>$n at ".time()."</h4>";
  for ($i = 0; $i<50; $i++ ){    
  $fp = fopen("$n.txt", "r");
  $s = fread($fp, filesize("$n.txt") );
  fclose($fp);
  $fp = fopen("$n.txt", "w");
  $s = $_SERVER['HTTP_USER_AGENT'].' '.time();
  if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
      fwrite($fp, $s);
      // fflush($fp);// flush output before releasing the lock
      flock($fp, LOCK_UN);    // release the lock
    } else {
      echo "Couldn't get the lock!";
    }

  }
}

我尝试为多个用户写文件读取,但是只有一个用户可以写文件。我知道,当我将fwrite与flock-LOC_EX一起使用时,下一个脚本必须等待写入完成。但是在这里似乎文件大小不会等到写操作完成。我的看法是,当文件大小为0时,它会尝试到达文件,因此,这会产生问题:使用原始脚本编写文件时,将从文件中读取0字节。

是否可以为fread函数修复此问题?

此脚本的目的是测试fread是否有一定限制,并检查以后读取的数据(如果在不使用fflush的情况下是否确实写入了数据)。

2 个答案:

答案 0 :(得分:1)

    function test($n){
echo "<h4>$n at ".time()."</h4>";
for ($i = 0; $i<50; $i++ ){
  $start = microtime(true);

  $fp = fopen("$n.txt", "r");
  if(filesize($n.txt) > 0)
  {
    $s = fread($fp, filesize($n.txt) );
    fclose($fp);
    $fp = fopen("$n.txt", "w");
    $s = $_SERVER['HTTP_USER_AGENT'].' '.time();
     if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
     fwrite($fp, $s);
     // fflush($fp);// flush output before releasing the lock
     flock($fp, LOCK_UN);    // release the lock
     } else {
     echo "Couldn't get the lock!";
     }
  }
  else
  {
    echo "Filesize must be greater than 0";
  }



  }
 }

 please change $s variables name its use same things two time

答案 1 :(得分:0)

  $fp = fopen("$n.txt", "r");
  $s = fread($fp, filesize("$n.txt") );
  fclose($fp);

该错误发生在上述三行的中间行。

首先,可以将以下三行重写为一行:

$s = file_get_contents("$n.txt");

但是,这不是必需的,因为这三行代码在您的代码中是完全多余的。他们没有做任何有用的事情。

他们要做的是打开一个文件,将其内容存储到$s,然后关闭它。

但是您立即将$s设置为其他值,从而丢弃先前的值,并使其毫无意义地从文件的第一位读取它。

如果需要保留文件的原始内容,请使用file_get_contents()并确保不覆盖变量的内容。

如果不需要文件的原始内容,则只需从代码中删除这三行。

偶然地,此错误突出显示了您应该采用的一些良好编码实践:首先,切勿在两个不同的事物上重复使用变量,其次,始终给变量(和函数)起好名字。 $s不是一个好名字; $previousFileContents将是一个更好的名字;它会使错误更加明显。