我正在使用以下代码在 PHP 中创建数据并将数据附加到 tar 存档中。问题是当我对同一个文件进行原子写入时,phar 没有对 tar 文件使用排他锁,这会导致问题。
function phar_put_contents($fname, $archive, $data) {
$i=0;
do {
$fp = @fopen($archive.'.lock', 'w');
if(!$fp) {
usleep(25);
continue;
}
if(flock($fp, LOCK_EX)) {
try{
$myPhar = new PharData($archive.'.tar',0);
$myPhar[$fname] = $data;
$myPhar->stopBuffering();
flock($fp, LOCK_UN) && @fclose($fp);
@unlink($archive.'.lock');
return true;
} catch (Exception $e) {
error_log($e->getMessage()." in ".$e->getFile().":".$e->getLine(),0);
unset($e);
@flock($fp, LOCK_UN) && @fclose($fp);
}
}
} while ($i++<8);
return false;
}
使用外观文件似乎是一个“好”的解决方案,但它不是最佳的,因为我的档案经常被破坏。