我有一个将其输入写入文本文件的表单。 是否可以锁定文本文件进行编辑,并且可能会给出一条友好的消息“该文件由其他用户编辑,请稍后再试”。
如果文件同时有多个编辑器,我想避免冲突。
以下是当前添加条目的方式。
$content = file_get_contents("./file.csv"); $fh = fopen("./file.csv", "w"); fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm); fwrite($fh, "\n" . $content); fclose($fh);
有什么想法吗?
答案 0 :(得分:4)
您可以使用flock()
功能锁定文件。有关详情,请参阅this
类似的东西:
<?php
$content = file_get_contents("./file.csv");
$fp = fopen("./file.csv", "w"); // open it for WRITING ("w")
if (flock($fp, LOCK_EX))
{
// do your file writes here
fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm);
fwrite($fh, "\n" . $content);
fclose($fh);
flock($fh, LOCK_UN); // unlock the file
}
?>
答案 1 :(得分:2)
为了满足需求:
例如:
$lockwait = 2; // seconds to wait for lock
$waittime = 250000; // microseconds to wait between lock attempts
// 2s / 250000us = 8 attempts.
$myfile = '/path/to/file.txt';
if( $fh = fopen($myfile, 'a') ) {
$waitsum = 0;
// attempt to get exclusive, non-blocking lock
$locked = flock($fh, LOCK_EX | LOCK_NB);
while( !$locked && ($waitsum <= $lockwait) ) {
$waitsum += $waittime/1000000; // microseconds to seconds
usleep($waittime);
$locked = flock($fh, LOCK_EX | LOCK_NB);
}
if( !$locked ) {
echo "Could not lock $myfile for write within $lockwait seconds.";
} else {
// write out your data here
flock($fh, LOCK_UN); // ALWAYS unlock
}
fclose($fh); // ALWAYS close your file handle
} else {
echo "Could not open $myfile";
exit 1;
}
答案 2 :(得分:1)
您可以使用PHP's flock function来锁定文件以进行写入,但该锁定不会在Web请求中保留,也不适用于NFS挂载(至少根据我的经验)。
您最好的方法是在同一目录中创建一个令牌文件,检查它是否存在并报告错误(如果存在)。
与任何锁定方案一样,您将在操作完成后保留竞争条件和锁定,因此您需要一种方法来缓解这些情况。
我建议在编辑并将该值存储在锁定文件中之前创建文件的哈希值。还将该哈希值作为编辑表单的一部分发送到客户端(因此它作为提交请求中的数据返回)。在编写之前,将传递的哈希值与文件中的值进行比较。如果它们相同,则提交数据并删除锁定。
如果它们不同,则显示错误。
答案 3 :(得分:0)
您可以尝试flock — Portable advisory file locking
?
答案 4 :(得分:-1)
我只想使用一个简单的整数或类似的东西。
$content = file_get_contents("./file.csv");
$fh = fopen("./file.csv", "w");
$status = 1;
...
if($status == 1){
fwrite($fh, $date_yy . '-' . $date_mm . '-' . $date_dd . '|' . $address . '|' . $person . '|' . $time_hh . ':' . $time_mm);
fwrite($fh, "\n" . $content);
fclose($fh);
$status = 0;
}
else
echo "the file is edited by another user, please try again later.";
这是你的意思吗?