プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
PHP、作成したファイルをダウンロード後に削除する
結論から書くと、あれ?普通に

1.ファイル作成
2.ファイルをダウンロード
3.ファイルを削除

の手順でファイルが削除されたよ?です。

「ダウンロードをキャンセルするとファイルが削除されないんです~」って
教えてgooに書いてあったから駄目元だったのですが、普通に消えました。
Linux環境だからだべか(--?

まぁ、いーや。

それでは詳細を書いていきます。

PHP、mysqldumpを使ってMySQLのデータベースをダンプする

の記事で書いた通り、DBの内容をファイルに出力して、それをダウンロードしていたのですね。
DBの内容が書かれたファイルをサーバ上に置いておくのはちょっと嫌だったので、
ファイルの削除ボタンを用意して、ダウンロード後に手動で削除していました。
これが面倒くさいなーと感じたのがきっかけです。
ファイルの作成はmysqldumpを使ってやっているので、
「一時ファイルなんて作るなよ」は無理だったのですね。
そのため

1.ファイル作成
2.ダウンロード
3.ファイル削除

を一連の流れでやりたかったのです。

それではやってみませう。

取りあえずは駄目元で、ダウンロード処理の後に削除処理を入れてみましたφ(--)

<?php
    //DB情報
    $id = "ユーザID";
    $pwd = "パスワード";
    $db = "データベース名";

    //出力ファイル名
    $fileName = dirname(__FILE__) . '/db_dump.sql';

    //コマンド生成
    //「/usr/bin/mysqldump -u $id -p$pwd $db > $fileName 」
    $cmd = '/usr/bin/mysqldump';
    $cmd = $cmd . ' -u ' . $id;
    $cmd = $cmd . ' -p' . $pwd;
    $cmd = $cmd . ' ' . $db;
    $cmd = $cmd . ' > ' . $fileName;

    //実行
    system($cmd);

    if(!file_exists ($fileName)){
        print "file not exists";
        exit;
    }else{
        //ファイルダウンロード
        header ("Content-disposition: attachment; filename=wa3_db.sql");
        header ("Content-type: application/octet-stream; name=wa3_db.sql");

        readfile($fileName);

        //ファイル削除
        unlink($fileName);


    }
?>

残念ながら、これだと上手く動かn……あれ?動いたよ?(--;
ちゃんとダウンロードもできたしファイルも削除されました。

おぉ?なんで?!Σ( ̄◇ ̄;

ログを吐いて確認してみたところ、ファイルダウンロードのダイアログが出た時点で
処理は最後まで流れているようです。
というか、ブラウザに応答を返したあとも引き続き処理を実行しているようですね。

1.ヘッダを返す
header ("Content-disposition: attachment; filename=wa3_db.sql");
header ("Content-type: application/octet-stream; name=wa3_db.sql");

2.ファイルを読み込んで中身を返す(ダウンロード用)
readfile($fileName);

3.ファイルを削除
unlink($fileName);

の流れにおいて「2.」の時点ではファイルがあるので、ファイル読み込みはできる。
「3.」の時点でファイルを削除されるが、ダウンロードする内容は「2.」の時点で標準出力に送り済み。
ダウンロードしようがキャンセルしようが後はどうぞご自由に。
ダウンロードする内容はもうそっちに送ってるよ~。
作ったファイルはもうなくなってるよ~。な状態みたいです。

なるほど(--)
何となく、応答を返したらそこで処理が終わるイメージでいましたが、
冷静に考えたらそんなことは無いですよね。

当たり前な動きな気がします。

ん~、じゃあ、なんで上手く行かなかった人がいるんだべ(--?
環境の問題かヴァージョンの問題か分かりませんが、
取りあえず私は普通に

1.ファイル作成
2.ファイルをダウンロード
3.ファイルを削除

の手順で作成したファイルが削除されました。

何となくモヤモヤするけど、取りあえず完了\(--)/
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● PHP  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事