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
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
Performance Engineering for Everyone
elenatanasoiu
0
250
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
150
「なぜそう決めたのか」を残し続ける仕組み ― Notion AI カスタムエージェント × Slack連携による設計判断の自動記録 - NIKKEI Tech Talk #47
niftycorp
PRO
0
250
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
160
Webフレームワークの ベンチマークについて
yusukebe
0
190
鹿野さんに聞く!『TypeScriptコードレシピ集』で磨く実践力
tonkotsuboy_com
4
960
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.7k
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
630
[2026年度第1回ORセミナー] 計画最適化ベンチャーと競技プログラミング人材
terryu16
0
280
20260623_Loop Engineeringで自分の分身の問い合わせBotを作る
ryugen04
0
110
はてなアカウント基盤 State of the Union
cockscomb
1
1.2k
Featured
See All Featured
Docker and Python
trallard
47
3.9k
GraphQLとの向き合い方2022年版
quramy
50
15k
Utilizing Notion as your number one productivity tool
mfonobong
4
340
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
860
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
190
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
490
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Evolving SEO for Evolving Search Engines
ryanjones
0
230
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
630
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/