PHP写入文件的问题

PHP写入文件的问题,php,file,Php,File,如果我创建了一个计数器程序,它基本上加载文本文件“counter.txt”,然后读取该文件,如果它包含一个数字,则将该数字增加1,然后用该数字更新该文件并保存该文件 上述程序的代码可以很好地工作,比如说每秒执行1次,但当执行时间非常高(例如每秒100次)时,问题就开始了 我面临的问题是,文件内容有时被擦除,有时计数器计数不正确。假设我每秒执行100次,但执行次数只会增加10次。我确信所有的执行都已完成,因为每次执行都会在递增数字后写入一个文件,并且在另一个目录中写入了100个文件,用于计算执行的

如果我创建了一个计数器程序,它基本上加载文本文件“counter.txt”,然后读取该文件,如果它包含一个数字,则将该数字增加1,然后用该数字更新该文件并保存该文件

上述程序的代码可以很好地工作,比如说每秒执行1次,但当执行时间非常高(例如每秒100次)时,问题就开始了

我面临的问题是,文件内容有时被擦除,有时计数器计数不正确。假设我每秒执行100次,但执行次数只会增加10次。我确信所有的执行都已完成,因为每次执行都会在递增数字后写入一个文件,并且在另一个目录中写入了100个文件,用于计算执行的数量,但中的计数仅递增10

    <?php 
$File = "counter.txt"; 
$handle = fopen($File, 'r+') ;
$data = fread($handle, 512) ; 
 $count = $data + 1; 
fseek($handle, 0) ; 
 fwrite($handle, $count) ; 
 fclose($handle) ; 
 ?> 

问题是两个文件同时计数。计数器设置不正确。你需要确保;该文件一次只能访问一次

Process1: Reads File and gets 0 
Process1: Increments 0 to 1 
Process2:Reads File and gets 0 
Process1: Writes 1 to File 
Process2: Increments 0 to 1 
Process2: Write 1 to File

嗨,马斯特卡西姆是对的

使用
flock
()锁定文件

<?php
//some code here
flock($file_handle, LOCK_EX) // <- Your code will pause here until you get the lock for indefinite amount of time or till your script times out
//some code here
?>


如果您碰巧已经在php页面中使用了DB,您可以将计数器放入其中,那么您只需要一个UPDATE语句
SET counter=counter+1

您需要防止脚本的多个实例同时读/写文件。这可以通过锁定或文件锁定来实现。请参阅,这也需要检查,如果文件已锁定,如果是,请等待一段时间或返回FALSE。@ott--为什么需要检查?检查PHPDoc中的这一行-“默认情况下,此函数将阻塞,直到获得请求的锁为止”对,我没有意识到该调用的阻塞。