通过引用flock():删除没有竞争条件的锁定文件?当进程意外死亡时,将flock'ed文件解锁?,
我生成以下代码.我的目的是在任何给定的时间内只允许单线程/单个进程运行临界区代码.
<?php
// Exclusive locking based on function parameters.
$lockFileName = '/tmp/cheok.lock';
// Create if doesn't exist.
$lockFile = fopen($lockFileName, "w+");
if (!flock($lockFile, LOCK_EX)) {
throw new \RumtimeException("Fail to perform flock on $lockFileName");
}
echo "start critical section...\n";
sleep(10);
echo "end critical section.\n";
// Warning: unlink(/tmp/cheok.lock): No such file or directory in
unlink($lockFileName);
flock($lockFile, LOCK_UN);
Run Code Online (Sandbox Code Playgroud)
我会一直得到警告
警告:取消链接(/tmp/cheok.lock):没有这样的文件或目录
当第二个等待进程继续执行时,第一个进程已经删除了物理磁盘文件.第二个进程尝试unlink归档,该进程已被第一个进程删除.
并且,如果第3个进程加入,并尝试执行fopen第2个进程正在尝试执行,该unlink怎么办?
简而言之,执行锁定文件清理的正确方法是什么?
我有一个PHP脚本文件的多部分问题.我正在创建此文件,每秒更新一次数据库.没有其他建模方法,必须每秒完成.
现在我正在运行CentOS,我是新手.第一个菜鸟问题是:
我如何通过SSH运行php文件.我读到它只是#php path-to/myfile.php.但我试图回应一些东西,我没有在文中看到它.
现在我不认为启动文件会成为一个问题.我猜的一个问题是,我不知道它是否可能,但是这里有.
我是否有可能百分百确定该文件只运行一次.如果我偶然再次运行该文件会发生什么.
我进一步想知道,如果我每秒都对一个日志执行写操作,我就知道一切都运行正常.如果出现错误或出现错误,日志文件将停止.
是用fopen写入日志文件,还是写入和关闭.这不会花费很多时间,在CentOS中没有更简单的方法.
好吧我的另一个重点是当我运行文件时会发生什么.文件是在内存中运行,还是在系统中使用该文件.它是否响应文件中所做的更改,例如停止执行脚本.
我可以在文件本身中实现某种停止机制.或者是否有一个命令我可以用来停止文件.
我知道的另一个选择是实现每分钟运行一次的cronjob.而这个cronjob执行php文件.php文件将循环一分钟,更新所需的一切,然后终止.我实现了这个方法,但只使用了浏览器.我只是浏览了mu文件,然后打开它.我看到浏览器忙了一分钟,但它没有更新数据库中的任何内容.有谁知道这可能是什么原因.
我的另一个问题是通过实现cronjob方法,我填写PLESK面板的命令是什么.它与上面的命令相同.只是php和文件名.或者是否有像-f -q -something这样的特殊命令.
抱歉所有的菜鸟问题.
如果有人可以帮助我,我真的很感激.
再见!