Php在写入时锁定文件
我正在使用txt文件中的小数据库测试我的代码。我发现的最重要的问题是:当用户同时写入一个文件时。为了解决这个问题,我使用了Php在写入时锁定文件,php,fwrite,flock,Php,Fwrite,Flock,我正在使用txt文件中的小数据库测试我的代码。我发现的最重要的问题是:当用户同时写入一个文件时。为了解决这个问题,我使用了flock。 我的计算机的操作系统是安装了xampp的windows(请对此进行评论,因为我知道flocks在linux上工作得很好,没有windows),但是我需要在linux服务器上进行此测试 实际上,我已经通过在20个窗口中同时加载相同的脚本来测试我的代码。第一个结果工作正常,但测试后数据库文件显示为空 我的代码: $file_db=file("test.db"); $
flock
。
我的计算机的操作系统是安装了xampp的windows(请对此进行评论,因为我知道flocks在linux上工作得很好,没有windows),但是我需要在linux服务器上进行此测试
实际上,我已经通过在20个窗口中同时加载相同的脚本来测试我的代码。第一个结果工作正常,但测试后数据库文件显示为空
我的代码:
$file_db=file("test.db");
$fd=fopen("".$db_name."","w");
if (flock($fd, LOCK_EX))
{
ftruncate($fd,0);
for ($i=0;$i<sizeof($file_db);$i++)
{
fputs($fd,"$file_db[$i]"."\n");
}
fflush($fd);
flock($fd, LOCK_UN);
fclose($fd);
}
else
{
print "Db Busy";
}
$file_db=file(“test.db”);
$fd=fopen(“$db_name.”,即“w”);
如果(羊群($fd,锁定)
{
ftruncate($fd,0);
对于($i=0;$i我已经使用@lolka_bolka的答案重新编写了脚本,它可以工作。因此,在回答您的问题时,如果文件test.db
为空,则文件$db_name
可能为空。之后加上“w”无效
作用
返回数组中的文件。数组中的每个元素对应于文件中的一行,换行符仍然附加。失败时,file()返回FALSE
您不必添加额外的行尾符号
作用
PHP支持一种以建议方式锁定完整文件的可移植方式(这意味着所有访问程序都必须使用相同的锁定方式,否则将无法工作)
这意味着文件
功能不受锁的影响。这意味着$file_db=file(“test.db”);
可以读取文件,而其他进程则介于ftruncate($fd,0);
和fflush($fd);
之间。因此,您需要读取锁内的文件内容
$db_name = "file.db";
$fd = fopen($db_name, "r+"); // w changed to r+ for getting file resource but not truncate it
if (flock($fd, LOCK_EX))
{
$file_db = file($db_name); // read file contents while lock obtained
ftruncate($fd, 0);
for ($i = 0; $i < sizeof($file_db); $i++)
{
fputs($fd, "$file_db[$i]");
}
fflush($fd);
flock($fd, LOCK_UN);
}
else
{
print "Db Busy";
}
fclose($fd); // fclose should be called anyway
为什么你要发明轮子?请使用数据库作为数据库。如果你不知道平面文件是如何工作的,请不要回答,因为实际上很多系统都使用平面文件,谢谢,不存在mysql,如果你找人把它翻译成英语,你完全不清楚你在问什么。这不是答案。这就是为什么这是作为评论。这个问题看起来像。这就是为什么我问“为什么?”此外,还有一些数据库在没有服务器的情况下工作,并使用文件存储数据库。另外,flock
也有一些系统限制。是的,这很难理解。在句末使用点。这是许多语言的通用规则。FPUT不需要2个参数吗?不,db不为空,FPUT我忘记放第一个参数,因为我在这里写剧本对不起我现在放好了
$ for i in {1..20}; do php 'file.php' >> file.log 2>&1 & done