次のコードを使用して、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;
}
ルック ファイルを使用することは「良い」解決策のように思えますが、アーカイブが頻繁に破損するため、最適ではありません。