Php 多进程读取同一文件

Php 多进程读取同一文件,php,Php,我的应用程序中有一个小问题。 我有许多进程是自动启动的,从带有crontab的服务器上,用php编写以读取文件夹中的文件 有时,不同的进程读取同一个文件并在应用程序内部产生问题。 有办法解决这个问题吗? 实际上,我读取文件夹中的所有文件,读取每个文件并立即删除,但有时另一个进程在我删除之前读取相同的文件 这是我用cakephp3编写的脚本(因此,像File这样的一些类仅适用于cakephp3,但不是问题的重点),用于阅读和删除: $xml_files = glob(TMP . 'xml/*.xm

我的应用程序中有一个小问题。 我有许多进程是自动启动的,从带有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();
    }
}   

用于获取(或尝试获取)文件锁并相应地采取行动。

这称为竞争条件,在处理文件时,您可以在进程a使用文件时锁定该文件,它将锁定该文件,然后其他进程将检查该文件是否已锁定,如果已锁定,则不执行任何操作。然后在进程A完成后解锁该文件。

请您举例说明如何在我的脚本中使用它好吗?@AlessandroMinoccheri我不能,因为您使用了一些“文件”类,而不是经典的文件句柄。也许“File”类已经内置了锁方法。
flock()
文档中有一些例子。@MarcinOrlowski我看过flock()文档,但我想知道更好的方法是什么It@AlessandroMinoccheri我认为没有理由不使用
flock()
这里,因为它就是为了这个目的而存在的。请您举个例子,说明如何在我的脚本中使用它。有趣的是,建议锁定是由框架处理的。exists()条件在这里似乎没有任何用处,您是否尝试过将其替换为if($string=$file->read())?我已经尝试过了,但没有办法解决问题@code kobold