Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ファイルを選択してZIPダウンロードする機能ってどうやって作るの? / phpcondo 2023
Search
meihei
January 12, 2024
Programming
1
710
ファイルを選択してZIPダウンロードする機能ってどうやって作るの? / phpcondo 2023
https://fortee.jp/phpcon-hokkaido-2024/proposal/569f0b56-276e-4aad-822f-29ccb72e86a8
meihei
January 12, 2024
Tweet
Share
More Decks by meihei
See All by meihei
QRコードを学んで遊ぼう / php-study-177
meihei3
0
76
改めて学ぶ Trait の使い方 / phpcon odawara 2025
meihei3
1
1k
List とは何か? / PHPerKaigi 2025
meihei3
0
1.3k
WebアプリケーションにおけるPDOの使い方入門 / phpcon odawara 2024
meihei3
3
2.1k
PHPerライフをChrome拡張開発でちょっと便利に / PR TIMES x DMM.com
meihei3
1
400
New Relic CodeStreamを 使って、エラーを 加速的迅速に改修しよう! #NRUG Vol.8
meihei3
0
390
PHP8.2から見る、2つの配列 / PHP Conference Japan 2023
meihei3
0
2.2k
良いコードを書く 〜10年後のPR TIMESを作る〜 / LT会 in #PRTIMES_HACKATHON 2023
meihei3
2
250
月に一度の大規模リファクタリングでレガシーコードと向き合う取り組み / PHP Conference Fukuoka 2023
meihei3
4
1.1k
Other Decks in Programming
See All in Programming
ABEMAモバイルアプリが Kotlin Multiplatformと歩んだ5年 ─ 導入と運用、成功と課題 / iOSDC 2025
akkyie
0
320
Web Components で実現する Hotwire とフロントエンドフレームワークの橋渡し / Bridging with Web Components
da1chi
3
1.8k
GraphQL×Railsアプリのデータベース負荷分散 - 月間3,000万人利用サービスを無停止で
koxya
1
1.1k
SpecKitでどこまでできる? コストはどれくらい?
leveragestech
0
520
明日から始めるリファクタリング
ryounasso
0
110
Catch Up: Go Style Guide Update
andpad
0
170
階層構造を表現するデータ構造とリファクタリング 〜1年で10倍成長したプロダクトの変化と課題〜
yuhisatoxxx
3
910
Breaking Up with Big ViewModels — Without Breaking Your Architecture (droidcon Berlin 2025)
steliosf
PRO
1
330
LLMとPlaywright/reg-suitを活用した jQueryリファクタリングの実際
kinocoboy2
4
670
ネイティブ製ガントチャートUIを作って学ぶUICollectionViewLayoutの威力
jrsaruo
0
130
私はどうやって技術力を上げたのか
yusukebe
43
17k
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
220
Featured
See All Featured
Producing Creativity
orderedlist
PRO
347
40k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
15k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
30
2.9k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
9
580
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Rebuilding a faster, lazier Slack
samanthasiow
84
9.2k
YesSQL, Process and Tooling at Scale
rocio
173
14k
Code Reviewing Like a Champion
maltzj
525
40k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
9.7k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.5k
Transcript
ファイルを選択して ZIPダウンロードする機能って どうやって作るの? PHPカンファレンス北海道2024 1
meihei / 江間 洋平 株式会社PR TIMES Backend Engineer (PHP/Python/Go) X:
@app1e_s GitHub: @meihei3 Bluesky: @meihei.bsky.social 直近の登壇 自己紹介 \推しカラーはホワイトです!/ 2
(宣伝)Run on PHP Playground 作りました • php.net 上のサンプルコードを php-play.dev で実行
できるボタンが追加される Chrome 拡張機能です 3
今日話すこと • 「Zipダウンロード機能」を題材に、AWSの 構成を考える話 • コードの話は出てきません 4
こんな機能です • 企業がアップロード したファイルを • ユーザーが複数選択 して • Zip圧縮してダウンロー ドできる機能
5
仕様を聞く 設計を考える 6
7
PdM ※実際のPdMは猫ではなく人間です。架空の人物という体なので見た目が猫になっています。 8
PdM Zipファイルのダウンロード 機能を作ります 9
仕様から考える1 Zipファイルをダウンロードできるようにする。 • ファイルが(ほぼ)変更が無いのであれば、S3に 置くだけでよい ◦ (例えば、管理者が用意したZipファイルを ダウンロードする) 10
設計イメージ1 11
PdM Zip圧縮する中身のファイル は、企業がアップロードした ものです Zipファイルのダウンロード 機能を作ります 12
仕様から考える2 Zip圧縮する中身のファイルは、企業がアップロードし たものです。 • 中身のファイルが更新されたら、生成し直す ◦ 動的に生成か、静的に生成か 13
仕様から考える2 Zip圧縮する中身のファイルは、企業がアップロードし たものです。 • 中身のファイルが更新されたら、生成し直す ◦ 動的に生成か、静的に生成か →サービス・機能の特徴に合わせる 14
アップロードからダウンロードまでの時間軸 15
静的になるようにZipファイルを事前に生成 16
静的になるようにZipファイルを事前に生成 →ダウンロード時に待ち時間が発生しない 17
動的にZipファイルを生成 18
動的にZipファイルを生成 →ダウンロード時に待ち時間が発生する 19
事前生成 vs 動的生成 メリット デメリット 事前生成 (静的ファイル) • サーバーの負荷が 少ない
• 高速なレスポンス • ストレージの上限 • 柔軟性に制限あり 動的生成 • 柔軟性がある • 内容が最新 • サーバーへの負荷 • レスポンス時間の 遅延 20
事前生成 vs 動的生成 メリット デメリット 事前生成 (静的ファイル) • サーバーの負荷が 少ない
• 高速なレスポンス • ストレージの上限 • 柔軟性に制限あり 動的生成 • 柔軟性がある • 内容が最新 • サーバーへの負荷 • レスポンス時間の 遅延 実際にそれがサービスに求められているか? 21
事前生成 vs 動的生成 メリット デメリット 事前生成 (静的ファイル) • サーバーの負荷が 少ない
• 高速なレスポンス • ストレージの上限 • 柔軟性に制限あり 動的生成 • 柔軟性がある • 内容が最新 • サーバーへの負荷 • レスポンス時間の 遅延 サービスにとって致命的になるか? 22
仕様から考える2 Zip圧縮する中身のファイルは、企業がアップロードし たものです。 • 中身のファイルが更新されたら、生成し直す ◦ 動的に生成か、静的に生成か • 検討事項 ◦
内容の変更頻度が多いか? ◦ その機能のアクセス数は多いか? 23
仕様から考える2 Zip圧縮する中身のファイルは、企業がアップロードし たものです。 • 中身のファイルが更新されたら、生成し直す ◦ 動的に生成か、静的に生成か • 検討事項 ◦
内容の変更頻度が多いか? →少ない ◦ その機能のアクセス数は多いか? →少ない 静的ファイルを作る方針 24
設計イメージ2 25
PdM 26
PdM Zip圧縮する中身のファイル は、企業がアップロードした ものです Zipファイルのダウンロード 機能を作ります 選択したファイルをZip圧縮 してダウンロード出来ます 27
仕様から考える3 選択したファイルをZip圧縮してダウンロード出来る。 • 静的ファイルを作るのは難しい ◦ 組み合わせ数が増大 • 動的に生成 ◦ 動的生成のデメリットを解消するか
28
仕様から考える3 選択したファイルをZip圧縮してダウンロード出来る。 • 静的ファイルを作るのは難しい ◦ 組み合わせ数が増大 • 動的に生成 ◦ 動的生成のデメリットを解消するか
→サービス・機能の特徴に合わせる 29
事前生成 vs 動的生成 メリット デメリット 事前生成 (静的ファイル) • サーバーの負荷が 少ない
• 高速なレスポンス • ストレージの上限 • 柔軟性に制限あり 動的生成 • 柔軟性がある • 内容が最新 • サーバーへの負荷 • レスポンス時間の 遅延 30
仕様から考える3 選択したファイルをZip圧縮してダウンロード出来る。 • 静的ファイルを作るのは難しい ◦ 組み合わせ数が増大 • 動的に生成 ◦ 動的生成のデメリットを解消するか
• 検討項目 ◦ サーバーへの負荷 ◦ パフォーマンス 31
仕様から考える3 選択したファイルをZip圧縮してダウンロード出来る。 • 静的ファイルを作るのは難しい ◦ 組み合わせ数が増大 • 動的に生成 ◦ 動的生成のデメリットを解消するか
• 検討項目 ◦ サーバーへの負荷 →どちらかというと重要 ◦ パフォーマンス →そこまで重要ではない 32
サーバーへの負荷を減らす • リクエストを受けるWebサーバーと、Zipファイルを 生成するBatchサーバーで分ける →非同期処理 • 2回目以降は生成処理を実行しないようにする ファイルキャッシュの仕組み ◦ 現段階では不要 •
(機能が独立しているならLambdaが便利) 33
設計イメージ3 34
設計イメージ3 Zipファイルの ダウンロード開始 35
36 非同期処理なのでファイルが 生成されているかわからない
非同期処理なのでファイルが 生成されているかわからない 37 ステータスを確認するために、ポーリング用のAPIを用意。
同期的なリクエストの場合 38
非同期的なリクエストの場合 39
設計イメージ4 40
設計イメージ4 ポーリング用のエンドポイント 41
「実行中の状態」と 「ファイルが見つからない状態」の 判別ができない 42
43 生成開始時に「実行中」の状態をINSERT 生成完了時に「完了」の状態へUPDATE 「実行中の状態」と 「ファイルが見つからない状態」の 判別ができない
設計イメージ5 44
設計イメージ5 生成開始とメイン の処理で分ける 45
PdM 46
まとめ • Zipファイルをダウンロードする機能のAWS構成につ いて一例を話しました ◦ サービス・機能の特徴を限定しないと、やり方はもっ とあります。 • 以下を繰り返す ◦
要件・仕様を聞く ◦ 出来る方法・Pros/Consを考える ◦ 作ってみて発生した問題を解消する 47
付録:ブログでも公開しています https://developers.prtimes.jp/2023/12/25/use_go_and_aws_to_build_press_kit_batch_download/ 48