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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
570
Seeing Through Serverless: Observability for AWS Lambda with ADOT and CloudWatch Application Signals
seike460
PRO
1
160
Seeing Through Serverless: ADOT と CloudWatch Application Signals で実現する AWS Lambda のオブザーバビリティ(日本語版)/ Seeing Through Serverless (Japanese Edition)
seike460
PRO
1
30
モノレポの型は、そのままつながる 〜Hono RPCで型を素通しする開発体験〜 / Monorepo Types Connect As-Is: Passing Types Through with Hono RPC
seike460
PRO
1
38
OSSのコンセプトを知る / Understanding the Concept Behind an OSS
seike460
PRO
1
36
型も通る、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
660
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
480
実行委員長目線で振り返る JAWS DAYS 2026 / JAWS DAYS 2026 from the Chair's Perspective
seike460
PRO
1
36
SLO から始める SRE / Starting SRE with SLO
seike460
PRO
1
110
Other Decks in Programming
See All in Programming
速習iPhone Duo対応
yuukiw00w
2
890
フロントエンドUIフレームワークのこれまでとこれから
ssssota
5
3k
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.2k
テストを司るデーモンに会いに行く 〜隔離した仮想マシンでテストを通すまで〜
h1d3mun3
1
590
動作中のプログラムの中身をリアルタイムに覗く / Realtime Debugger for CSharp with Roslyn
prota
1
1.6k
MVNOの申込からeSIM開通までをiOSアプリでつなぐ- 本人確認・MNP・通信事業者基盤をまたぐ実装
satotakeshi
0
510
技術的負債を組織課題として解く-増えすぎたマイクロサービスとの戦い-
reimaru
1
2.5k
難しいけど、読めた。- OSSの入口に立った話。
sts11142
0
130
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
490
アクセシビリティから考える情報設計
high_g_engineer
0
420
SREの越境 / SRE Collaboration
y0hgi
2
290
AWSに止められる覚悟してますか?
morizo_1984
2
480
Featured
See All Featured
Become a Pro
speakerdeck
PRO
31
6.3k
How to make the Groovebox
asonas
2
2.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
250
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
[SF Ruby Conf 2025] Rails X
palkan
3
1.4k
The Language of Interfaces
destraynor
162
27k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
330
Everyday Curiosity
cassininazir
0
330
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.3k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.9k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
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/