我有一个文件名数组,每个进程只需要创建和写入一个文件.
这就是我的意思:
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 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); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。