【備忘録】PHPでPharDataで作ったtarを消すと「Text file busy」になる現象

どうもお久しぶりです。 ゴエです。

なんかこのブログ1年に1回更新ってレベルになってきたんで、開発してた時に詰まった所とか 備忘録として残そうかなぁって思ったんで記事にしましたw

今回は、ログファイルやバックアップCSVを作成する時に容量を極力減らそう作成したファイルをtar.gzに圧縮する際に使った 「PharData」クラスで躓いた所があったので備忘録として残しておく。

起こった現象

今回バックアップ系ファイルを圧縮するために初めて「PharData」クラスを使ってtar.gzファイルを作成した。 PharDataクラスを使ってtar.gzファイルを作成する際にtarファイルも一緒に作成されるらしい。 tarは不要なので他のサイトを参考にunlink関数を使って消そうとしたら「Text file busy」という警告が出て消えなかった。 以下が実際に行って警告が出た記述。

環境はvagrantで構築したcentOS、PHP7.3 以下、試したサンプルソース

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
        // ファイルのパスを設定
        $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でファイルを削除する前に変数を削除するようにした。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
        // ファイルのパスを設定
        $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が消せた。

Hugo で構築されています。
テーマ StackJimmy によって設計されています。