Livewire の FileUpload を使っていて、ふと素朴な疑問が浮かびました。
アップロード途中の一時ファイルって誰が消しているんだろう?
ユーザーがブラウザを閉じたり、フォーム送信前に離脱した場合、 一時ファイルがサーバーに残り続けるのでは…?という疑問です。
調べてみたところ、Livewire には 一時ファイルのクリーンアップ機構がきちんと実装されていました。 自分用の覚え書きとしてまとめておきます。
Livewire 一時ファイルの保存場所
Livewire の一時アップロードファイルは、以下の設定で保存先が決まります。
// FileUploadConfiguration.php
config('livewire.temporary_file_upload.disk') ?: config('filesystems.default')
config('livewire.temporary_file_upload.directory') ?: 'livewire-tmp'
つまり通常は
storage/app/livewire-tmp
のようなディレクトリに保存されます。
一時ファイルが作成されるタイミング
ユーザーがフォームでファイルを選択した瞬間に、 Livewire は以下のエンドポイントにリクエストを送ります。
POST /livewire/upload-file
この時点で
- ファイルは UUIDの名前
- livewire-tmp ディレクトリ
に保存されます。 つまり
- フォーム送信前でも
- 選択した瞬間に
すでにサーバーへアップロードされています。
一時ファイルの削除タイミング
Livewire の一時ファイルは、次のようなタイミングで削除されます。
| ケース | 削除方法 |
|---|---|
| フォーム送信成功 | $upload->store() によって本来の保存先へ移動し、livewire-tmp から消える |
| セッション中断(ブラウザを閉じるなど) | 一時ファイルが残るが、次のアップロード時にクリーンアップが実行される |
| S3利用 | Livewireは削除しない。S3のライフサイクルポリシーで管理する |
ポイントはここです。
Livewireは「次のアップロード時」に古いファイルを掃除する設計になっています。
クリーンアップの条件
削除対象になるのは 24時間以上経過したファイル です。
つまり
- 今日アップロードされた残骸 → 残る
- 昨日以前の残骸 → 削除対象
という動作になります。
自動削除の設定
Livewire にはこの挙動を制御する設定があります。
livewire.temporary_file_upload.cleanup
デフォルトは
true
です。
もし false にすると、自動削除は行われません。
実装コード
クリーンアップ処理は以下に実装されています。
vendor/livewire/livewire/src/Features/SupportFileUploads/WithFileUploads.php
アップロード完了時に、次の処理が呼ばれます。
function _finishUpload(...) {
if (FileUploadConfiguration::shouldCleanupOldUploads()) {
$this->cleanupOldUploads();
}
}
実際の削除ロジックは次のような感じです。
protected function cleanupOldUploads() {
// 24時間前のタイムスタンプ
$yesterdaysStamp = now()->subDay()->timestamp;
// livewire-tmp のファイルを走査
if ($yesterdaysStamp > $storage->lastModified($filePathname)) {
$storage->delete($filePathname);
}
}
つまり
- livewire-tmp を走査
- 24時間より古いファイルを削除
というシンプルな仕組みです。
まとめ
Livewire の一時ファイルのライフサイクルをまとめるとこうなります。
- ファイル選択時に
/livewire/upload-fileへアップロード livewire-tmpに UUID 名で保存- フォーム送信成功で
store()により移動 - 残骸は 次のアップロード時に 24時間以上のものを削除
つまり、 Livewire が自動的に掃除してくれる仕組みが最初から入っている ということでした。
こういう内部実装を知っておくと、
- サーバーのストレージ管理
- S3利用時の設計
などを考えるときにも安心できます。