どうもお久しぶりです。
ゴエです。
なんかこのブログ1年に1回更新ってレベルになってきたんで、開発してた時に詰まった所とか
備忘録として残そうかなぁって思ったんで記事にしましたw
今回は、ログファイルやバックアップCSVを作成する時に容量を極力減らそう作成したファイルをtar.gzに圧縮する際に使った
「PharData」クラスで躓いた所があったので備忘録として残しておく。
起こった現象
今回バックアップ系ファイルを圧縮するために初めて「PharData」クラスを使ってtar.gzファイルを作成した。
PharDataクラスを使ってtar.gzファイルを作成する際にtarファイルも一緒に作成されるらしい。
tarは不要なので他のサイトを参考にunlink関数を使って消そうとしたら「Text file busy」という警告が出て消えなかった。
以下が実際に行って警告が出た記述。
環境はvagrantで構築したcentOS、PHP7.3
以下、試したサンプルソース
// ファイルのパスを設定
$file = "./sample.csv";
$gzFile = "./sample.tar";
// PhareDataを初期化
$pd = new PharData($gzFile);
try {
$pd->addFile( $file, "sample.csv" );
$pd->compress( Phar::GZ );
}catch (Exception $e){
echo $e->getMessage();
}
// 不要なファイルを削除する
unlink($gzFile); // Text file busy警告が出て消えない
対策
色々試した結果、どうやらPharDataを初期化した変数を解放しないと内部ロックがかかるらしいので
unlinkでファイルを削除する前に変数を削除するようにした。
// ファイルのパスを設定
$file = "./sample.csv";
$gzFile = "./sample.tar";
// PhareDataを初期化
$pd = new PharData($gzFile);
try {
$pd->addFile( $file, "sample.csv" );
$pd->compress( Phar::GZ );
}catch (Exception $e){
echo $e->getMessage();
}
// 不要なファイルを削除する
unlink($pd); // PharDataを初期化した変数を削除
unlink($gzFile); // tarファイルが消せる
これでtarが消せた。