Ho una matrice di nomi di file e ogni processo deve creare e scrivere solo in un singolo file.Crea file in modo thread-safe
Questo è quello che mi è venuto a:
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
}
Ma non mi piace che sto facendo leva sulla filesize
.
Eventuali proposte per farlo in un altro (migliore) modo?
UPD: aggiunto le etichette per discutere facilmente
UPD 2: sto usando filesize
perché non vedo altro modo affidabile per verificare se l'attuale filo creato il file (quindi è vuoto ancora)
UPD 3: la soluzione dovrebbe essere condizione corsa libera.
quale problema stai cercando di risolvere facendo questo? – cgTag
@Mathew Foscarini: gestisce le risorse di terze parti che non dispongono della sincronizzazione della concorrenza. – zerkms