php – 以线程安全的方式创建文件

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了php – 以线程安全的方式创建文件脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个文件名数组,每个进程只需要创建和写入一个文件.

这就是我的意思

foreach ($filenames as $VMiDFile) {
    if (file_exists($VMidFile)) { // A
        continue;
    }

    $fp = foPEn($VMidFile,'c'); // B

    if (!flock($fp,LOCK_EX | LOCK_NB)) { // C
        continue;
    }

    if (!filesize($VMidFile)) { // D
        // wrITe to the file;

        flock($fp,LOCK_UN);
        fclose($fp);
        break;
    }

    flock($fp,LOCK_UN);
    fclose($fp); // E
}

但我不喜欢我依赖文件大小.

有什么建议以另一种(更好的)方式做到一点

UPD:添加标签以便轻松讨论

UPD 2:我正在使用filesize,因为我没有看到任何其他可靠的方法来检查当前线程是否创建了文件(因此它还是空的)

UPD 3:解决方应该是无条件竞赛.

一个可能的,稍微丑陋的解决方案是锁定一个文件,然后测试该文件是否存在:
$lock = fopen("/tmp/".$filename."LOCK","w"); // A

if (!flock($lock,LOCK_EX)) { // B
    continue;
}
if(!file_exists($filename)){ // C
    //File doesn't exist so we kNow that this thread will create it
    //Do stuff to $filename
    flock($lock,LOCK_UN); // D
    fclose($lock);
}else{
    //File exists. This thread didn't create it (at least in this iteration).
    flock($lock,LOCK_UN);
    fclose($lock);
}

这应该允许对文件的独占访问,并且还允许决定是否调用fopen($VMidFile,’c’);将创建该文件.

脚本宝典总结

以上是脚本宝典为你收集整理的php – 以线程安全的方式创建文件全部内容,希望文章能够帮你解决php – 以线程安全的方式创建文件所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。