Home
Slides
Blog
slide.seike460.com
Home
Slides
Blog
Home
Slides
PHP Conference 2018
PHP Conference 2018
PHP Conference 2018
2018年12月15日
PHP
PHP
Design Pattern
Multi-paradigm
Keyboard Shortcuts
←
→
Navigate slides
Space
Next slide
F
Fullscreen
ESC
Exit fullscreen
Home
First slide
End
Last slide
B
.
Pause
S
Speaker notes
?
Reveal.js help
Close
## PHPは本当に遅いのか PHPカンファレンス2018 清家史郎(@seike460)
###### Who? Fusic Co., Ltd.  清家史郎  @seike460    
### tech - Program Language - PHP - Go - Elixir - infrastructure - Server - AWS - infrastructure as code - Network - Other - Serverless - Vue.js
### OSS products - s3ry (s3 prompt cli) - https://github.com/seike460/s3ry - utakata (Serverless Slack Notificatier) - https://github.com/seike460/utakata ### Organizer - Serverless Meetup Fukuoka
#### Agenda - 今回の趣旨 - 方針 - 環境解説 - 実装ロジック - ベンチ結果 - 纏め
#### 今回の趣旨 「PHPは本当に遅いのか」の検証 - 遅いと言われる話が多い、言われ続けてきた - PHP以外の言語実装が出来ず、聞き入れるしかなかった - 少しGo、Elixirの実装が出来るようになった - 実装して試してみたい - 「PHPは遅くない、みんなPHP書こう!」って言いたい
#### 方針 - WEBシステム - WEBの構成は取り入れる - シンプル - 実装方法によりバラつかないように - DB影響をミニマム - RDBはどうしても重くなる(一方で外せない要素) - Request Parameterの扱う - 外部Requestからの動的処理 - frameworkを使わない - frameworkの実装と言語のパフォーマンスを切り離す為 - 無理にでもClass化や関数化は行う - Class、関数を使わないプログラムは一般的に考え辛い
#### 各言語のバージョン - GO - 1.11.1 - Elixir - 1.7.4 - PHP - 7.3
#### 環境解説 - インフラ環境はローカルに構築 - 最初はAWSでやろうとした - Hyper Visorは避けるべきと考えた

#### ミドルウェア - Nginx - 1.15.7 - PostgreSQL - 11.1 - Redis - 5.0.1
#### 接続部 | 言語 | PHP | GO | Elixir | | ---- | ---- | ---- | ---- | | WEB | nginx ||| | APP | php-fpm | net/http | Cowboy | | Redis | phpredis | go-redis | redix | | DB | pgsql | database/sql | postgrex |
#### チューニング - Nginx - worker_processes auto; - worker_connections 65535; - PostgreSQL - pgtuneの結果を採用 - https://pgtune.leopard.in.ua/#/ - Redis - maxclients 65536 - tcp-keepalive 60 - save ""
#### 言語チューニング - php-fpm - pm.xxx系 -> 1500 - 普段必須なExtensionsは入れる - net/http - 特になし - Cowboy - 特になし
#### カーネルパラメータチューニング - portrange - net.inet.ip.portrange.first=10000 - net.inet.ip.portrange.last=65535 - maxOpenFiles - /Library/LaunchDaemons/limit.maxfiles.plist - ulimit -n 524288状態
#### ベンチマークツール - tsung 1.7.0 - Erlang製ベンチマークツール - 10000 Client * 90 Request - 10000 Client * 10 Error - 1000000
#### Profiler - tideways_xhprof - 関数毎の呼び出し回数、実行回数がわかる - 今回実装のボトルネックがわかっていたので割愛
#### 実装ロジック解説 - Request Parameter Validation - Cast - 値がsmallint(32767)の範囲を超えてないか

- キャッシュ検証 - ベンチマーク開始時にFLUSHALL - キャッシュが存在する場合、キャッシュを返す - 存在しない場合DBから取得し、キャッシュに保存しながら値を返す

- 取得したデータをResponse

### )例 PHP実装 ``` /** * Validation */ if (phpValidate::paramValidate($_GET) === false) { http_response_code(400); echo '400 Bad Request'; exit; } $id = (int) $_GET['id']; /** * cache */ $cacheconn = phpCache::getInstance(); $result = $cacheconn->find($id); if ($result === false) { /** * db */ $dbconn = phpDb::getInstance(); $row = $dbconn->find($id); if (empty($row)) { http_response_code(404); echo '404 Not Found'; exit; } else { $cacheconn->set($row); } $result = $row; } http_response_code(200); echo $result; ```
#### PHPベンチ - 最高速 - 1861.2 req/sec - 平均 - 600.56 req/sec
#### Goベンチ - 最高速 - 2011.7 req/sec - 平均 - 700.26 req/sec
#### Elixirベンチ - 最高速 - 2411.6 req/sec - 平均 - 615.88 req/sec ※500 Errorが2200件程… RedisのmaxClientError…
#### 初期ベンチ後 | 言語 | PHP | GO | Elixir | | ---- | ---- | ---- | ---- | | MAX | 1861.2 | 2011.7 | 2411.6 | | AVG | 600.56 | 700.26 | 615.88 | - Goはやはり早い… - PHP、Elixirも食らいついている - 遅いとは言えないが… - どうにか出来ないか考えてみた
#### いらないExtensionsを外す 今回の実装上必要なものだけに厳選 ``` --without-pear --enable-cgi --with-pgsql=postgres --disable-debug --enable-fpm --with-apcu ```
#### PHPベンチ - 最高速 - 1922.8 req/sec - 平均 - 681.64 req/sec
#### ある懸念 | 言語 | PHP | GO | | ---- | ---- | ---- | | MAX | 1922.8 | 2011.7 | | AVG | 681.64 | 700.26 | - 最高速、平均速度共に落ち着いてしまった - Redisに引っ張られてしまった可能性…
#### 実装を捨てる echoサーバー ただRequestを受け取り、Responseを返す
#### PHPEcho - 最高速 - 6020.2 req/sec - 平均 - 3333.80 req/sec
#### GoEcho - 最高速 - 6129.3 req/sec - 平均 - 3663.64 req/sec
- Echo | 言語 | PHP | GO | | ---- | ---- | ---- | | MAX | 6020.2 | 6129.3 | | AVG | 3333.80 | 3663.64 | - ちょっとGoが早いけど、PHPも追従している用にみえる - 別のボトルネックがある…?
#### 纏め - やはりGoは早い - PHP、Elixirもほぼ同程度の速度 - API応答などを考えるとPHP負けてない - 個人の所感としてはPHPは遅くない
今回自分の思考の範囲でパフォーマンス測定を行いました - こうした方が適切な測定じゃないのか - こうした方が早いんじゃないのか 様々な考えが浮かんだのでは無いかと思っています
是非皆さんも速度検証してください さらなるPHPパフォーマンス議論の場が 広がればいいなと考えています
私はまだPHP書き続けようと思っています 一緒により良いWEBを作っていきましょう
Thank you! Fusicは技術が大好きなエンジニアを募集しています  https://fusic.github.io
Swipe to navigate
Previous
Next
Related Slides
PHPで作るWebSocketサーバー
2024/6/1
View
PHPを書く理由、PHPを書いていて良い理由
2024/1/1
View
有効な使い方を正しく理解して実装する PHP8.3の最新機能の「ウラ側」
2023/11/1
View