相关疑难解决方法(0)

测试文件是否被锁定

在PHP中,如何测试文件是否已被锁定flock?例如,如果另一个正在运行的脚本调用了以下内容:

$fp = fopen('thefile.txt', 'w');
flock($fp, LOCK_EX);
Run Code Online (Sandbox Code Playgroud)

php file-locking flock

7
推荐指数
1
解决办法
1万
查看次数

flock():是否可以仅检查文件是否已被锁定,如果没有实际获取锁定?

我的用例如下:我有一个程序强制在任何给定时间只能运行它的一个实例,所以在启动时它总是试图抓住标准位置的锁文件,并在文件终止时终止已被锁定.这一切都运行正常,但现在我想用一个新的命令行选项增强程序,当指定时,将导致程序打印出程序的状态报告然后终止(在主锁定保护之前)上面),其中包括锁文件是否已被锁定,正在运行的进程的pid是什么(如果存在),以及从数据库查询的某些程序状态.

正如您所看到的,当在"状态报告"模式下调用时,如果可用,我的程序实际上应该获取锁.我只是想知道文件是否已经锁定,所以我可以通知用户状态报告的一部分.

从我的搜索来看,似乎没有办法做到这一点.相反,唯一可能的解决方案似乎是flock()使用非阻塞标志调用,然后,如果您实际获得了锁定,则可以立即释放它.像这样的东西:

if (flock(fileno(lockFile), LOCK_EX|LOCK_NB ) == -1) {
    if (errno == EWOULDBLOCK) {
        printf("lock file is locked\n");
    } else {
        // error
    } // end if
} else {
    flock(fileno(lockFile), LOCK_UN );
    printf("lock file is unlocked\n");
} // end if
Run Code Online (Sandbox Code Playgroud)

我认为获取锁定并立即释放它并不是什么大问题,但我想知道是否有更好的解决方案,不涉及短暂和不必要的锁定获取?

注意:已经有几个类似的问题,其标题可能会使它看起来与这个问题完全相同,但从这些问题的内容可以清楚地看出,OP在获取锁定后有兴趣实际写入文件,所以这是一个截然不同的问题:

c locking flock

7
推荐指数
3
解决办法
7023
查看次数

fwrite 写入 NUL

我正在尝试使用 PHP 写入文件,这是我正在使用的代码(取自我上一个问题的答案):

$fp = fopen("counter.txt", "r+");

while(!flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    // waiting to lock the file
}

$counter = intval(fread($fp, filesize("counter.txt")));
$counter++;

ftruncate($fp, 0);      // truncate file
fwrite($fp, $counter);  // set your data
fflush($fp);            // flush output before releasing the lock
flock($fp, LOCK_UN);    // release the lock

fclose($fp);
Run Code Online (Sandbox Code Playgroud)

读取部分工作正常,如果文件被读取,则其内容读取良好,即如果文件包含2289,则2289读取。

问题是,当它增加并将值重写到该文件时,[NUL][NUL][NUL][NUL][NUL][NUL][NUL][NUL]1会被写入。

我错过了什么?为什么写入空字符?

php file fwrite nul

1
推荐指数
1
解决办法
1610
查看次数

标签 统计

flock ×2

php ×2

c ×1

file ×1

file-locking ×1

fwrite ×1

locking ×1

nul ×1