【问题标题】:How to read and write to a file, ensuring file is locked?如何读写文件,确保文件被锁定?
【发布时间】:2015-05-09 05:34:15
【问题描述】:

如果文件在 24 小时内最后一次修改,我希望以数字方式增加文件的内容,否则将文件的内容重置为 1。但是我想确保无论有多少用户同时访问该脚本,它都能继续工作时间(脚本总是需要执行,但要确保它不会错误地覆盖/计算 - 我相信这就是使用群发的地方)。

请看下面的代码:

$host_limit = 50;
$file = 'timer.txt';
$fh = fopen($file,'r+');
if (flock($fh,LOCK_EX)) {
$content = fgets($fh);
//FILE HAS NOT BEEN MODIFIED IN LAST 24 HOURS
if (strtotime('-24 hours') > filemtime($file)) {
$content = 1;
} else {
$content = ($content + 1);
}
fwrite($fh, $content);
fflush($fh);
flock($fh,LOCK_UN);
}
fclose($fh);

if ($content < $host_limit) {
//do stuff
}

上述工作是否可以如我所愿(因为无法模拟我期望测试的内容)?

【问题讨论】:

    标签: php fopen atomic flock


    【解决方案1】:

    您可以使用 fopen 和 fwrite,而不是使用 文件获取内容($文件); 和 file_put_contents($file, $content, LOCK_EX);

    查看手册:

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

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

    【讨论】:

    • 在 $content 上使用 file_get_contents 会不会有风险,因为它不支持 LOCK_EX,所以实际上可能包含过时的文件内容?带有 LOCK_EX 的 file_put_contents 是否会等到任何先前的锁在执行之前解锁,还是会在该实例中失败?
    • 对不起,我可能误会了.. 你可以把它和上面的 file_get_contents 和 file_put_contents 混在一起.. 除此之外,试试你的运气.. 它看起来不太远,但几乎不可能做到自己做一个压力测试。。也许把一些数据放在一个日志文件中,然后测试几天
    • file_get_contents() 不是原子的,因为它不遵守咨询锁。
    • 这个解决方案似乎对我不起作用。尽管在 file_put_contents 上使用了 LOCK_EX,但我偶尔会从 file_get_contents 读取空字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多