Php在写入时锁定文件

Php在写入时锁定文件,php,fwrite,flock,Php,Fwrite,Flock,我正在使用txt文件中的小数据库测试我的代码。我发现的最重要的问题是:当用户同时写入一个文件时。为了解决这个问题,我使用了flock。 我的计算机的操作系统是安装了xampp的windows(请对此进行评论,因为我知道flocks在linux上工作得很好,没有windows),但是我需要在linux服务器上进行此测试 实际上,我已经通过在20个窗口中同时加载相同的脚本来测试我的代码。第一个结果工作正常,但测试后数据库文件显示为空 我的代码: $file_db=file("test.db"); $

我正在使用txt文件中的小数据库测试我的代码。我发现的最重要的问题是:当用户同时写入一个文件时。为了解决这个问题,我使用了
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