我的应用程序中有一点问题。 我有很多进程自动启动,从带有crontab的服务器,用php编写来读取文件夹中的文件。
有时,不同的进程会读取同一个文件并在应用程序中创建问题。 有办法解决这个问题吗? 实际上,我读取文件夹中的所有文件,读取每个文件并立即删除,但有时另一个进程在删除它之前读取同一文件。
这是我用 cakephp3 编写的脚本(所以像File这样的一些类只用于cakephp3但不是问题的重点)来读取和删除:
$xml_files = glob(TMP . 'xml/*.xml');
foreach($xml_files as $fileXml)
{
//read the file and put into a string or array or object
$explStr = explode('/', $fileXml);
$filename = $explStr[count($explStr) - 1];
$path = TMP . '/xml/' . $filename;
$file = new File($path, false);
if($file->exists()){
$string = $file->read();
$file->close();
$file->delete();
}
}
答案 0 :(得分:2)
使用flock()
获取(或尝试获取)文件锁并采取相应行动。
答案 1 :(得分:2)
它被称为竞争条件,当处理文件时,你可以在进程A使用它时锁定文件,它会锁定它,然后其他进程将检查它是否被锁定,如果它什么都不做。然后在进程A完成后解锁文件。