我有一个非常简单的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);
}
答案 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
的效率要比打开文件(在循环之外)并写入同一句柄的效率低在一个循环中。
我上面说这个的原因是黑的。
如果您要写一行,请改为
希望如此。