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
僕も、PHPフレームワーク作ってみた
kubotak
0
250
ハーネスエンジニアリング白書
kubotak
0
99
Laravelにはdeleted_atがありますけど?
kubotak
2
120
PHPでWebSocketサーバーを実装しよう2025
kubotak
0
2.4k
情報漏洩させないための設計
kubotak
6
3.2k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
240
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
690
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
12k
Other Decks in Programming
See All in Programming
「人を評価する AI」の設計と実装
ryoyanara
0
250
初心者DevRelとして参加者だった私が、DevRel Talks!#2に登壇するまでにしてきたこと
sokohirai
0
110
MySQLとPostgreSQLって何が違うの?
akagami
0
140
【QA Test Talk Vol.8】AI-DLC による Whole Team Approach の加速
pkshadeck
PRO
0
250
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
in-process GraphQL のすすめ #ginzajs
izumin5210
4
1.5k
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
2k
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
550
ALB ログから Trace を気合で繋げる技術
fohte
6
710
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
1.1k
Dockerfile CMD for Node.js
grazie1999
0
130
片田舎のおっさん、 Swift Buildのダイアモンド問題解決の不具合修正PRを出すが、解決方法がキャッシュをしないようにすることであり、ビルド時間が伸びると言われてマージされないので高速化もする/swiftbuild
yimajo
0
290
Featured
See All Featured
Fashionably flexible responsive web design (full day workshop)
malarkey
408
67k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
360
Making the Leap to Tech Lead
cromwellryan
135
10k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
180
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The browser strikes back
jonoalderson
0
1.6k
Designing Experiences People Love
moore
143
24k
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
490
Product Roadmaps are Hard
iamctodd
55
12k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
53k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
250
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 :)