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
HTTP リクエストとPHP / HTTP Request to PHP
Search
shiro seike
PRO
January 22, 2022
Programming
520
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
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
120
Seeing Through Serverless: ADOT と CloudWatch Application Signals で実現する AWS Lambda のオブザーバビリティ(日本語版)/ Seeing Through Serverless (Japanese Edition)
seike460
PRO
1
12
モノレポの型は、そのままつながる 〜Hono RPCで型を素通しする開発体験〜 / Monorepo Types Connect As-Is: Passing Types Through with Hono RPC
seike460
PRO
1
13
OSSのコンセプトを知る / Understanding the Concept Behind an OSS
seike460
PRO
1
13
型も通る、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
620
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
440
実行委員長目線で振り返る JAWS DAYS 2026 / JAWS DAYS 2026 from the Chair's Perspective
seike460
PRO
1
15
SLO から始める SRE / Starting SRE with SLO
seike460
PRO
1
89
Architecture as SteeringOn-Ramp to AI-DLC
seike460
PRO
0
53
Other Decks in Programming
See All in Programming
ソフトウェアラスタライザ
fadis
1
780
tsc.rip を支える技術 / Kyoto.なんか #8
susisu
0
4.3k
kubernetes コンポーネント開発入門 / 新卒N年目の勉強会&交流会!〜〇〇への誘い〜 #n_study
mazrean
0
160
承認済みなのに差戻しできてしまうバグ、型で潰せます
shinchit
0
140
Hono + Inertia + React で LP を構築した話
oukayuka
2
200
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
数年滞っていたダークモード対応をおよそ2週間で完了させる
chigichan24
0
660
Pythonの実行はどこまで賢くなったのか? CPythonとPyPyから見る最適化のしくみ
curekoshimizu
4
2.7k
XP祭りでしか伝わらないフリップネタ #xpjug
murabayashi
0
100
LoopHub - ローカルで動く GitHub で、AI と共同開発
jugyo
0
380
Oxlintはいいぞ(続)
yug1224
1
540
AI時代に学ぶ 好きなルール 嫌いなルール Linter編
shorty5121
0
800
Featured
See All Featured
GitHub's CSS Performance
jonrohan
1033
470k
Unsuck your backbone
ammeep
672
58k
Abbi's Birthday
coloredviolet
3
9.7k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
970
How Software Deployment tools have changed in the past 20 years
geshan
1
34k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
320
The Limits of Empathy - UXLibs8
cassininazir
1
630
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
550
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
270
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
490
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
440
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/