Php 警告:flock()要求参数1是给定的资源字符串
我有一个非常简单的PHP程序,它不想工作。由于未知原因,它返回与主题相同的错误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
$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编程愉快!