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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
shiro seike
PRO
January 22, 2022
Programming
510
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
コミュニティの有益性 ~JAWS Days 2026 での体験を通して~ / The Benefits of a Community ~Through My Experience at JAWS Days 2026~
seike460
PRO
0
320
Architecture as SteeringOn-Ramp to AI-DLC
seike460
PRO
0
30
Why Continue AWS Community Builders
seike460
PRO
0
75
AWSコミュニティ活動は顧客のクラウド推進に効くのか / Do AWS community activities help customers adopt the cloud?
seike460
PRO
0
190
テレメトリーシグナルが導くパフォーマンス最適化 / Performance Optimization Driven by Telemetry Signals
seike460
PRO
2
280
AI-DLC 入門 〜AIコーディングの本質は「コード」ではなく「構造」〜 / Introduction to AI-DLC: The Essence of AI Coding Is Not “Code” but “Structure”
seike460
PRO
0
1.7k
今さら聞けないサーバーレスのいいところ 〜運用から解放される世界を目指して〜 / The Benefits of Serverless You Might Be Too Embarrassed to Ask About Now — Aiming for a World Free from Operational Burdens
seike460
PRO
0
110
AWS Lambda Durable Functions のユースケースを探る / Exploring Use Cases for AWS Lambda Durable Functions
seike460
PRO
0
97
歴史から学ぶ「Why PHP?」 PHPを書く理由を改めて理解する / Learning from History: “Why PHP?” Rediscovering the Reasons for Writing PHP
seike460
PRO
0
540
Other Decks in Programming
See All in Programming
ローカルLLMでどこまでコードが書けるか -拡張版 / How much code can be written on a local LLM Extended
kishida
12
4.6k
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
160
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
380
Performance Engineering for Everyone
elenatanasoiu
0
250
技術的負債解消で開発者の未来を開く- AIの力でコード刷新
kmd2kmd
0
140
Vite+ Unified Toolchain for the Web
naokihaba
0
410
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
620
SREは、MCPとSRE Agentをこう使え!
kazumax55
0
130
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.6k
Spec Driven Development | AI Summit Lisbon
danielsogl
PRO
0
230
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
エンジニアと一緒にテストコードの設計と実装を改善した話
mototakatsu
0
240
Featured
See All Featured
Writing Fast Ruby
sferik
630
63k
Discover your Explorer Soul
emna__ayadi
2
1.2k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
240
The Mindset for Success: Future Career Progression
greggifford
PRO
0
370
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
180
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
200
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
620
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
180
Navigating Team Friction
lara
192
16k
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/