我有这个表格:
<form action="/test.php" method="POST">
<input type="submit" value="Add">
</form>
提交给test.php
的:
<?php
echo "Hi";
$file = 'file.txt';
$fp = fopen($file, 'r');
if (flock($fp, LOCK_EX)) {
$current = file_get_contents($file);
$current .= "+\n";
file_put_contents($file, $current);
flock($fp, LOCK_UN);
}
sleep(2);
我正在使用羊群防止内容被错误覆盖。
由于sleep
部分,我可以连续单击Add
按钮。但是,无论我在加载时多久单击一次Add
按钮,在file.txt
中我只会发现一行:
+
我希望,如果在加载时按5次按钮,我应该得到
+++++
为什么不会这样?
备注
我知道这里有一些主题,如何防止使用CSRF进行双重提交或禁用使用JS提交的按钮(请参阅How to prevent multiple form submission on multiple clicks in PHP)。为什么在我的场景中没有重复提交?
除了可以写入test.php
中的文件之外,还可以在数据库中插入一行
$conn = new mysqli($servername, $username, $password, $dbname);
$sql = "INSERT INTO user (name) VALUES ('John')";
$conn->query($sql)
其中table
用户具有一个主要的自动增量列id
。多次单击该按钮仍只会导致插入一个新行。
答案 0 :(得分:0)
根据您的代码:
file_put_contents($file, $current, LOCK_EX);
请注意LOCK_EX
。
您正在锁定文件。
第一个进程正在休眠时,它正在锁定文件。
当第二个请求触发再次尝试写入文件的尝试时,它失败了(这是因为您没有测试成功而导致的失败),因此不会发生下一个+
的写操作。