Php 警告:flock()要求参数1是给定的资源字符串

Php 警告:flock()要求参数1是给定的资源字符串,php,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); fl

我有一个非常简单的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);
}

你有几件事出了问题

$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
这是您的文件句柄(资源),然后在调用
flock
之前移动
fopen

如果您只写一行,请改为这样做

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

它几乎相当于你在那里拥有的东西。好吧,只是它比9行更短,更简单,更酷

我甚至可以将其进一步缩减为一行:

  if(!file_put_contents('counter.txt', ++$counter, LOCK_EX)) or die('Unable');
LOCK\u EX
标志是锁独占的,与
flock
基本相同,只是在这种情况下,PHP为您处理所有文件流内容

真正的区别是,如果在循环中执行此操作,则获取文件句柄的成本很高,因此将输出循环到
文件\u put\u内容
比在循环内部打开文件(循环外部)并写入同一句柄的效率要低得多

黑森解释了我上面说的原因

如果您只写一行,请改为这样做

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

希望这是有意义的。

谢谢,我会尽快将它标记为已解决。为什么fopen在if语句内还是在if语句外很重要呢?一般来说,
flock
接受的不是文件名,而是文件流资源。在这种情况下,它是
$write
,或者换句话说,您从
fopen
获得的东西。因此错误
警告:flock()希望参数1是资源,字符串给定
,因此无法将其放入if中。好的,我认为错误是这样的,但这是我第一次编写PHP,所以知识非常有限。正如我在aswer中所说,如果您只写一行,那么
文件内容可能是更好的选择。但是学习也很好。只要记住fopen返回一个文件资源,那么这个错误对您来说就更有意义了。您甚至可以执行
echogetype($write)
,它会显示
resource
。祝你好运,PHP编程愉快!