Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
HTTP リクエストとPHP / HTTP Request to PHP
Search
shiro seike
PRO
January 22, 2022
Programming
540
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HTTP リクエストとPHP / HTTP Request to PHP
PHPerKaigi petit @福岡 202201 (オンライン開催)
https://phperkaigi.connpass.com/event/233366/
shiro seike
PRO
January 22, 2022
More Decks by shiro seike
See All by shiro seike
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
1.1k
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
170
Seeing Through Serverless: ADOT と CloudWatch Application Signals で実現する AWS Lambda のオブザーバビリティ(日本語版)/ Seeing Through Serverless (Japanese Edition)
seike460
PRO
1
43
モノレポの型は、そのままつながる 〜Hono RPCで型を素通しする開発体験〜 / Monorepo Types Connect As-Is: Passing Types Through with Hono RPC
seike460
PRO
1
51
OSSのコンセプトを知る / Understanding the Concept Behind an OSS
seike460
PRO
1
52
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
690
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
500
実行委員長目線で振り返る JAWS DAYS 2026 / JAWS DAYS 2026 from the Chair's Perspective
seike460
PRO
1
44
SLO から始める SRE / Starting SRE with SLO
seike460
PRO
1
120
Other Decks in Programming
See All in Programming
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
370
Railsバージョンを4倍にした話
optim
0
520
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
34k
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
290
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
600
GemmaをJevのように使ってみる / Use Gemma like Jev
kishida
5
820
Vue Fes Japan の “作る側”に関わってみて
naokihaba
0
170
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
300
🇪🇸 React Alicante 2026 (Workshop)
ythecombinator
PRO
0
100
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
S3 TablesのIcebergデータに、AIエージェントからアクセスしてみた / 20261016developersio2026joetsu-accessing-iceberg-in-s3tables-via-agent
kasacchiful
PRO
0
190
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
290
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
1
280
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
530
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Designing for Performance
lara
612
70k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
77k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Stop Working from a Prison Cell
hatefulcrawdad
274
21k
Chasing Engaging Ingredients in Design
codingconduct
0
370
Tell your own story through comics
letsgokoyo
1
1.1k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Building a Scalable Design System with Sketch
lauravandoore
464
34k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
Transcript
HTTPリクエストとPHP PHPerKaigi petit @福岡 202201 2022.1.22 清家史郎 1
自己紹介 清家 史郎 @seike460 - ID - GitHub:seike460 - Twitter:@seike460
- Work at - 株式会社 Fusic (フュージック) 技術開発本部/技術開発第一部門 - チームリーダー/エバンジェリスト プリンシパルエンジニア - Skill - PHP/Go/AWS - Community - Fukuoka.php Organizer - PHP Conference 2018 - 2021 - PHPerKaigi 2019 - 2021 2
Agenda 3 1. HTTP メッセージ 2. HTTP リクエスト 3. HTTP
ヘッダー 4. PHPとHTTPレスポンス 5. まとめ
01 HTTP メッセージ
PHPWebアプリケーションはどうやって動く? 5 ブラウザ等のクライアントからHTTPプロトコルを介して HTTPメッセージのやり取りを行います。
HTTP 6 Hypertext Transfer Protocol (HTTP) は HTML などのハイパーメディア文書を
転送するためのアプリケーション層プロトコル ウェブブラウザー(クライアント)とウェブサーバー間の通信を目的として設計 ※他の用途でも使用されることが有り HTTP は旧来のクライアント・サーバーモデルに則っており、クライアントはサーバーに リクエストを送信するためにポートを開き、サーバー側からのレスポンスが返ってくるまで待機。 HTTP ヘッダーによって、プロトコルの拡張や実験が容易になっており 、新しい機能であっても、 クライアントとサーバーが新たなヘッダーの意味について単純な合意があれば導入可能。 HTTP はいわゆるステートレスプロトコルであり、 サーバーは二つのリクエスト間で何もデータを保持しない。 参考:MDN Web Docs「HTTP」: https://developer.mozilla.org/ja/docs/Web/HTTP
HTTP 7 クライアントとサーバーは、個々のメッセージを交換することによって通信。 キャッシュ、フィルタリング、認証、負荷分散等の機能を提供するプロキシを中継することもある。 リクエスト…クライアントが送信するメッセージ レスポンス…サーバーが回答として送信するメッセージ
参考:MDN Web Docs「HTTP」: https://developer.mozilla.org/ja/docs/Web/HTTP
HTTPリクエストとHTTPレスポンス 8 ブラウザ等のクライアントからHTTPプロトコルを介して HTTPメッセージのやり取りを行います。 クライアントが送信してサーバーにアクションを起こさせる →HTTPリクエスト サーバーの回答であるレスポンス →HTTPレスポンス
HTTP メッセージ 9 HTTPリクエストは図の様な決まった形式のテキストを送信することで、 様々な情報を付与してサーバーに情報を要求して、 サーバーは要求されたリクエストに応じて処理を変更する事が出来る。
02 HTTP リクエスト
HTTP のフロー 11 1.TCPコネクションを開く(3ウェイ・ハンドシェイク) 2.HTTP メッセージを送信する(HTTPリクエスト) 3.サーバーから送信されたレスポンスを読み取る(HTTPレスポンス) 4.次のリクエストのために、コネクションを閉じるか再使用する ※HTTP/1.1
curlによるHTTPリクエスト 12 $ curl -v --http1.1 https://httpbin.org/get *
Trying 35.171.190.227:443... * Connected to httpbin.org (35.171.190.227) port 443 (#0) * ~省略~ * SSL certificate verify ok. > GET /get HTTP/1.1 > Host: httpbin.org > User-Agent: curl/7.77.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Date: Sat, 22 Jan 2022 00:45:29 GMT < Content-Type: application/json < ~省略~
HTTPリクエストの構成要素 13 > GET /get HTTP/1.1 ▪リクエストライン GET …
HTTP メソッド。クライアントが実行したい操作を定義する GET や POST等 /get … リソースのパス HTTP/1.1 … HTTP プロトコルのバージョン > Host: httpbin.org > User-Agent: curl/7.77.0 > Accept: */* ▪リクエストヘッダー サーバーに追加の情報を与える任意のHTTPヘッダー > ▪空行 ▪メッセージボディ POST等の場合はリクエスト内にボディが挿入されることがある。
POST リクエスト 14 $ curl -v -X POST --http1.1 https://httpbin.org/post
* ~省略~ * SSL certificate verify ok. > POST /post HTTP/1.1 > Host: httpbin.org > User-Agent: curl/7.77.0 > Accept: */* > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK < Date: Sat, 22 Jan 2022 01:14:54 GMT < Content-Type: application/json < Content-Length: 318 < ~省略~
POST Bodyの送信 15 $ curl -v -H "Content-Type: application/json" -d
'{"hoge":"fuga"}' --http1.1 https://httpbin.org/post ~省略~ * SSL certificate verify ok. > POST /post HTTP/1.1 > Host: httpbin.org > User-Agent: curl/7.77.0 > Accept: */* > Content-Type: application/json > Content-Length: 15 > * Mark bundle as not supporting multiuse < HTTP/1.1 200 OK ~省略~
POST Bodyの送信 16 $ curl -v -H "Content-Type: application/json" -d
'{"hoge":"fuga"}' --http1.1 --trace-ascii - https://httpbin.org/post ~省略~ 0000: POST /post HTTP/1.1 0015: Host: httpbin.org 0028: User-Agent: curl/7.77.0 0041: Accept: */* 004e: Content-Type: application/json 006e: Content-Length: 15 0082: => Send data, 15 bytes (0xf) 0000: {"hoge":"fuga"} == Info: Mark bundle as not supporting multiuse <= Recv header, 17 bytes (0x11) 0000: HTTP/1.1 200 OK ~省略~
03 HTTP ヘッダー
HTTP ヘッダー 18 HTTP リクエストやレスポンスでクライアントやサーバーが追加情報を渡す リクエストヘッダー … 読み込むリソースについての情報や、クライアントに関する詳細な情報 レスポンスヘッダー …
レスポンスに関する追加情報(場所や提供しているサーバーに関する情報) エンティティヘッダー … リソースの本体に関する情報(MIMEタイプや適用されるエンコード/圧縮方式などについての情報) ペイロードヘッダー … 転送されるデータの表現から独立した情報(コンテンツ長さや転送エンコード方式) 参考:MDN Web Docs「HTTP」: https://developer.mozilla.org/ja/docs/Web/HTTP
Google Chrome 開発者ツール 19
httpbin.org/getが返還するJSON 20 { args: { }, headers: { Accept: "~省略~",
Accept-Encoding: "gzip, deflate, br", Accept-Language: "ja,en-US;q=0.9,en;q=0.8", Cache-Control: "max-age=0", Host: "httpbin.org", Sec-Ch-Ua: "" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"", Sec-Ch-Ua-Mobile: "?0", Sec-Ch-Ua-Platform: ""macOS"", Sec-Fetch-Dest: "document", Sec-Fetch-Mode: "navigate", Sec-Fetch-Site: "none", Sec-Fetch-User: "?1", Upgrade-Insecure-Requests: "1", User-Agent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36 ", X-Amzn-Trace-Id: "Root=1-61eb64b7-24bc07aa6d8b197a203a12a9" }, origin: "125.56.55.69", url: "https://httpbin.org/get" }
一般的なHTTPリクエストヘッダー 21 Accept: "*/*" クライアントが理解できるコンテンツタイプを MIME タイプで伝える Accept-Encoding: "gzip,
deflate, br" コンテンツのエンコーディング、ふつうは圧縮アルゴリズムのどれをクライアントが理解することができるかを示します Apacheのmod_deflate等が利用 gzip:Lempel-Ziv coding (LZ77) と32ビット CRC を用いた圧縮形式 deflate:zlib 構造体と deflate 圧縮アルゴリズムを用いた圧縮形式 br:Brotli アルゴリズムを用いた圧縮形式 Accept-Language: "ja,en-US;q=0.9,en;q=0.8" クライアントがどの言語を理解できるか、どの種類のロケールが推奨されるかを示す Cache-Control: "max-age=0" キャッシュをコントロールするヘッダーで、 no-storeをつけることでキャッシュをさせなくしたり、有効期限を設定したりします。
拡張HTTPリクエストヘッダー 22 Sec-Fetch-Dest: "document", Sec-Fetch-Mode: "navigate", Sec-Fetch-Site: "none", Sec-Fetch-User: "?1",
フェッチメタデータリクエストヘッダー リクエストの発信元のコンテキストに関する追加情報を提供する HTTP リクエストヘッダー リクエストがどこから来たのかという追加情報をサーバーに提供し、悪意のあるリクエストを無視できるようになる Sec-Ch-Ua: "" Not;A Brand";v="99", "Google Chrome";v="97", "Chromium";v="97"" Sec-Ch-Ua-Mobile: "?0", Sec-Ch-Ua-Platform: ""macOS"", User-Agent Client Hints ユーザーエージェント(UA)クライアントヒントヘッダにより、サーバーはユーザーエージェント(ブラウザ)、 オペレーティングシステム、デバイスに応じて応答を変化させることができる。 X-Amzn-Trace-Id: "Root=1-61eb64b7-24bc07aa6d8b197a203a12a9" AWSが付与するTrace情報 Application Load Balancerが付与するIDで、リクエストの行方を追うために利用する
Sessionが利用するHTTPリクエストヘッダー 23 Cookie: "hoge=XxxxxxxxxxxxxxxxxxxxxxxxxxX" サーバーが情報処理後、状態を維持するのに必要な情報をサーバーに保存して、セッションIDを発行 レスポンスヘッダーのSet-Cookie ヘッダーでセッションIDを送信
保存されたCookieからセッションIDをリクエストヘッダーに付与する事で、最初に保存した状態の情報をやり取りする 詳しくは、PHPerKaigi2021 / PHPで学ぶ Session の基本と応用 / web-app-session-101 @hanhan1978
04 HTTPリクエストとPHP
HTTPリクエスト情報をPHPで取得する 25 $ php -S localhost:8000 [Sat Jan 21
23:01:11 2022] PHP 7.4.27 Development Server (http://localhost:8000) started [Sat Jan 21 23:02:53 2022] [::1]:56677 Accepted [Sat Jan 21 23:02:53 2022] [::1]:56677 [200]: GET / [Sat Jan 21 23:02:53 2022] [::1]:56677 Closing $ curl -v --http1.1 http://localhost:8000
Laravel public/index.php 26 同じ様に$_GETや$_POSTを利用することで HTTPリクエストからの情報をPHPにて取得可能 一方スーパーグローバル変数をそのまま利用するのは
利用できるスコープの観点からもアンチパターン では実際はどの様に処理しているのかを Laravelを例に見てみます。
Laravel と HTTPリクエスト 27
Laravel と HTTPリクエスト 28
Laravel と HTTPリクエスト 29
Laravel と HTTPリクエスト 30
Laravel と HTTPリクエスト 31
HTTPリクエストの行方 〜Laravelがレスポンスを返すまで〜 32
05 まとめ
まとめ Point 3 HTTPリクエストに様々な情報を載せる事でPHPは動作を決める事が出来る 34 PHPは一般的にHTTPメッセージであるHTTPリクエストを契機にHTTPレスポンスを構築する Point 1
HTTPリクエストはリクエストライン、リクエストヘッダー、メッセージボディで構成される Point 2
ご清聴いただきありがとうございました Thank You We are Hiring ! https://recruit.fusic.co.jp/