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
ある日突然、Laravel Queue Workerが壊れた
Search
kubotak
March 28, 2021
Programming
1.1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ある日突然、Laravel Queue Workerが壊れた
PHPerKaigi 2021 LT
kubotak
March 28, 2021
More Decks by kubotak
See All by kubotak
ハーネスエンジニアリング白書
kubotak
0
47
Laravelにはdeleted_atがありますけど?
kubotak
2
91
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
2k
情報漏洩させないための設計
kubotak
6
3.1k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
230
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
660
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
11k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.5k
Other Decks in Programming
See All in Programming
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
The Arts and Crafts of Work in the AI Era — Toward Mastery in Software Development
kuranuki
1
730
「エンジニアインターン、どうやって取った?」準備のリアルを語るLT会 Progate BAR
akiomatic
0
120
AI駆動開発で崩れていくコードベースを立て直す
kyoko_nr_nr
1
440
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
230
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
430
Oxcを導入して開発体験が向上した話
yug1224
4
290
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
200
JavaDoc 再入門
nagise
0
300
Oxlintのカスタムルールの現況
syumai
6
1k
Java × distroless で 軽量なコンテナイメージを / Java on Distroless
contour_gara
0
510
net-httpのHTTP/2対応について
naruse
0
460
Featured
See All Featured
Facilitating Awesome Meetings
lara
57
6.9k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
The untapped power of vector embeddings
frankvandijk
2
1.7k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
200
What's in a price? How to price your products and services
michaelherold
247
13k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Product Roadmaps are Hard
iamctodd
PRO
55
12k
Evolving SEO for Evolving Search Engines
ryanjones
0
210
Build The Right Thing And Hit Your Dates
maggiecrowley
39
3.2k
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
720
Optimizing for Happiness
mojombo
378
71k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
840
Transcript
Copyright © M&A Cloud All rights reserved. ある日突然、 Laravel Queue
Workerが壊れた PHPerKaigi2021/LT Kenjiro Kubota
Copyright © M&A Cloud All rights reserved. Profile 2 久保田
賢二朗 kubotak-is kubotak_public kenjiro.kubota 株式会社M&Aクラウド JavaScript Go PHP https://kubotak.page
Copyright © M&A Cloud All rights reserved. 前提知識 前提知識 •
AWS ElasticBeanstalk(以降EB)のWebサーバーとWorkerサー バー上でLaravel Queuesを利用したJobを運用 • メッセージングシステムとしてAWS SQSを利用
Copyright © M&A Cloud All rights reserved. アーキテクチャ
Copyright © M&A Cloud All rights reserved. ある日突然、 Laravel Queue
Workerが壊れた
Copyright © M&A Cloud All rights reserved. 何もしてないのに壊れた • というわけではない。
• PHP7.2のEB環境からPHP7.4にアップグレード後 に死んだ • EB環境が変わったことでなぜ死んだかは不明 何もしてないのに壊れた
Copyright © M&A Cloud All rights reserved. なぜ死んだのか なぜ死んだのか •
LaravelのQueueはJobというクラスをPHPシリアライズした文字 列のメッセージキューでやり取りする • Workerではメッセージから取得した文字列をアンシリアライズ することでPHPのコードとして実行する • アンシリアライズが失敗
Copyright © M&A Cloud All rights reserved. なぜアンシリアライズが失敗するのか なぜアンシリアライズが失敗するのか 原因が不明だがシリアライズ前にスペースが2つ連続で含まれる文字
列が、メッセージキューから取得されたあとのメッセージではスペー スが1つに纏められている事象があった (SQSからEBWorkerがHTTPに変換する際)
Copyright © M&A Cloud All rights reserved. コードで説明 PHPシリアライズされた状態の文字列
Copyright © M&A Cloud All rights reserved. コードで説明 アンシリアライズするともとのインスタンスに戻る
Copyright © M&A Cloud All rights reserved. コードで説明 12345678910111213 型:値
Copyright © M&A Cloud All rights reserved. コードで説明 アンシリアライズに失敗するとfalseとなる 11
実際の文字数と異なる
Copyright © M&A Cloud All rights reserved. わけがわからない上に影響範囲が大きい 対応
Copyright © M&A Cloud All rights reserved. 「文字列全部Base64エンコードしちゃお」 対応
Copyright © M&A Cloud All rights reserved. Base64 Base64 Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字
を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱う ためのエンコード方式である。 MIMEによって規定されていて、7ビットのデータしか扱うことの出来ない電子 メールにて広く利用されている。具体的には、A–Z, a–z, 0–9 までの62文字 と、記号2つ (+, /)、さらにパディング(余った部分を詰める)のための記号と して = が用いられる。 この変換によって、データ量は4/3(約133%)になる[1]。また、MIMEの基準 では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れると データ量は約137%となる[2]。 出典: フリー百科事典『ウィキペディア(Wikipedia)』
Copyright © M&A Cloud All rights reserved. Base64 Base64 Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字
を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱う ためのエンコード方式である。 MIMEによって規定されていて、7ビットのデータしか扱うことの出来ない電子 メールにて広く利用されている。具体的には、A–Z, a–z, 0–9 までの62文字 と、記号2つ (+, /)、さらにパディング(余った部分を詰める)のための記号と して = が用いられる。 この変換によって、データ量は4/3(約133%)になる[1]。また、MIMEの基準 では76文字ごとに改行コードが入るため、この分の2バイトを計算に入れると データ量は約137%となる[2]。 出典: フリー百科事典『ウィキペディア(Wikipedia)』 スペース撲滅
Copyright © M&A Cloud All rights reserved. __serialize/__unserializeを利用 __serialize/__unserializeを利用 •
PHP7.4から追加されたマジックメソッドの __serialize/__unserializeを利用 • 幸いにも弊社アプリケーションでは文字列をプリミティブではな くStringValue型という独自クラスで定義していたので、このク ラスに対してマジックメソッドを追加 ※7.4以前なら__sleep/__wakeupが代用できる
Copyright © M&A Cloud All rights reserved. __serialize/__unserializeを利用
Copyright © M&A Cloud All rights reserved. __serialize/__unserializeを利用
Copyright © M&A Cloud All rights reserved.
Copyright © M&A Cloud All rights reserved. まとめ まとめ •
メッセージングシステムを利用するときはPHPシリアライズの文字 列ではなくJSON形式のような汎用的な形式が良いと思う! ◦ とはいえスペースが消えちゃうのはよくわからん • プリミティブな値ではなくラッパーした型を使っているとこういう ケースで助かるぞ! • マジックメソッドありがとう!
Copyright © M&A Cloud All rights reserved. Thank you for
watching :)