警告:flock()期望参数1为资源,给定字符串

时间:2018-09-08 01:45:40

标签: php

我有一个非常简单的PHP程序,不想运行。由于未知原因,它会返回与主题相同的错误。

$file = 'counter.txt';
$counter = file_get_contents($file);
if(flock($file, LOCK_EX)){
    $counter += 1;
    echo $counter;
    $write = fopen($file, 'w') or die('Unable');
    fwrite($write, $counter);
    flock($file,LOCK_UN);
}

1 个答案:

答案 0 :(得分:1)

您有几处故障,

$file = 'counter.txt';
$counter = file_get_contents($file);
$write = fopen($file, 'w') or die('Unable'); //move this line

if(flock($write, LOCK_EX)){  //-- change this
   $counter += 1;
    echo $counter;
    fwrite($write, $counter);
    flock($write,LOCK_UN); //-- change this
}

主要问题是flock接受(流)资源作为输入,文件名只是一个字符串。因此,您无需使用$file(它是文件句柄(资源)),而只需使用$write,然后将fopen移到flock调用之前。

如果您要写一行,请改为

$file = 'counter.txt';
$counter += 1;
if(!file_put_contents($file, $counter, LOCK_EX)) or die('Unable');

http://php.net/manual/en/function.file-put-contents.php

这几乎等于您所拥有的。好吧,除了3 vs 9 lines更短,更容易和更酷。

我什至可以将其减少到1行:

  if(!file_put_contents('counter.txt', ++$counter, LOCK_EX)) or die('Unable');

LOCK_EX标志是Lock独占的,基本上与flock相同,只是在这种情况下,PHP为您处理了所有文件流内容。

真正的区别是,如果您在循环中执行此操作,则获取文件句柄会很昂贵,因此将输出循环到file_put_content的效率要比打开文件(在循环之外)并写入同一句柄的效率低在一个循环中。

我上面说这个的原因是黑的。

  

如果您要写一行,请改为

希望如此。