Des*_*ume 6 php linux shell concurrency
在我的Linux服务器上,我需要同步多个脚本,用BASH和PHP编写,这样只有其中一个脚本能够启动一个系统关键的工作,这是一系列BASH/PHP命令,这些工作会搞砸由两个或多个脚本同时执行.根据我在C++中使用多线程的经验,我熟悉互斥锁的概念,但是如何为在一系列不同进程中运行的脚本实现互斥锁,当然,这些脚本不是用C++编写的?
好吧,首先想到的解决方案是确保每个脚本最初创建一个"锁定标志"文件,让其他脚本知道该作业被"锁定",然后在完成该作业后删除该文件.但是,正如我所看到的,文件写入和读取操作必须是完全原子的才能让这种方法以100%的概率运行,并且相同的要求将适用于任何其他同步方法.而且我很确定文件写入/读取操作不是原子的,它们至少在所有现有的Linux/Unix系统中都不是原子的.
那么同步并发BASH 和 PHP脚本最灵活,最可靠的方法是什么?
我不是 PHP 程序员,但文档说它提供了flock您可以使用的便携式版本。第一个示例片段看起来非常接近您想要的。尝试这个:
<?php
$fp = fopen("/tmp/lock.txt", "r+");
if (flock($fp, LOCK_EX)) { // acquire an exclusive lock
// Do your critical section here, while you hold the lock
flock($fp, LOCK_UN); // release the lock
} else {
echo "Couldn't get the lock!";
}
fclose($fp);
?>
Run Code Online (Sandbox Code Playgroud)
请注意,默认情况下flock会等待直到可以获得锁。LOCK_EX | LOCK_NB如果您希望在程序的另一个副本已在运行的情况下立即退出,则可以使用。
使用名称“/tmp/lock.txt”可能是一个安全漏洞(我不想认真思考以确定它是否确实如此),因此您可能应该选择一个只能由您的程序写入的目录。
| 归档时间: |
|
| 查看次数: |
1150 次 |
| 最近记录: |