どうもお久しぶりです。
ゴエです。
なんかこのブログ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が消せた。