SlideShare a Scribd company logo

PHPで大規模ブラウザゲームを開発してわかったこと

2010年6月26日に行われたイベント、オープンソースカンファレンス2010 Hokkaido内のセミナーで使われた発表スライド「PHPで大規模ブラウザゲームを開発してわかったこと」

1 of 28
Download to read offline
PHPで
大規模ブラウザゲームを
 開発してわかったこと
    LOCAL PHP部
 株式会社インフィニットループ
      ke-tai.org
     松井 健太郎
自己紹介
松井 健太郎
・ LOCAL PHP部 部長
・ 株式会社インフィニットループ 代表
・ ke-tai.org 管理人
・ コーラが好き
自己紹介(2)




http://ke-tai.org/
本日の内容
1. ソーシャルゲーム大流行
2. 困った!ゲームなんて作ったことないぞ!?
 - 通常の案件とゲーム製作の違い

3. なぜPHPを使ってるの?
4. ゲーム向けの基本設計とサーバ構成
5. PHP実装のポイント
6. データベース設計で注意するところ
7. これが一番の問題!負荷対策について
8. その他こんなところに苦労した
ソーシャルゲーム大流行
・ それまでも兆しはあった
  → ブラウザゲームというジャンルは以前から存在していた
  → 海外での利用者数増加

・ はじまりはmixiアプリから
  → 2009年8月mixiアプリオープン
  → 2009年10月mixiアプリモバイルオープン
                                   サンシャイン牧場
・ 国内ウェブコンテンツ制作の業者がこぞってゲーム開発に参入

・ モバゲー、GREE、大手ゲーム会社などを巻き込んでの大戦争に

・ 2010年には1000億円市場になると言われている



                                 2010 mixi IR資料より
ブラウザ三国志について
運営(株)AQインタラクティブ
開発ONE-UP(株)
プログラム開発を(株)インフィニットループが担当

2009年6月サービス開始
2010年8月mixi版サービス開始
会員数約80万人以上(2010年5月現在)
月間PV数 約2億6千万PV(2010年5月の実績)
    (http://donnamedia.shoeisha.jp/site/detail/4392より)
Ad

Recommended

新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編infinite_loop
 
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」
MVPパターンによる設計アプローチ「あなたのアプリ報連相できてますか」U-dai Yokoyama
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計Yoshinori Matsunobu
 
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~
【Unite Tokyo 2019】Unityだったら簡単!マルチプレイ用ゲームサーバ開発 ~実践編~UnityTechnologiesJapan002
 
初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!初心者向けMongoDBのキホン!
初心者向けMongoDBのキホン!Tetsutaro Watanabe
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ota42y
 
The Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionThe Usage and Patterns of MagicOnion
The Usage and Patterns of MagicOnionYoshifumi Kawai
 
ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計ゲームエンジニアのためのデータベース設計
ゲームエンジニアのためのデータベース設計sairoutine
 

More Related Content

What's hot

エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころTakayuki Shimizukawa
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介Tetsutaro Watanabe
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門torisoup
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!mosa siru
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようShohei Okada
 
Javaでつくる本格形態素解析器
Javaでつくる本格形態素解析器Javaでつくる本格形態素解析器
Javaでつくる本格形態素解析器Works Applications
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
Humble Object Patternな話
Humble Object Patternな話Humble Object Patternな話
Humble Object Patternな話Hiroto Imoto
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話KEISUKE KONISHI
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツpospome
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪Takuto Wada
 
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析Takahiro Inoue
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容sairoutine
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術Takuto Wada
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意Yoshitaka Kawashima
 

What's hot (20)

エキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころエキスパートPythonプログラミング改訂3版の読みどころ
エキスパートPythonプログラミング改訂3版の読みどころ
 
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
 
TLS, HTTP/2演習
TLS, HTTP/2演習TLS, HTTP/2演習
TLS, HTTP/2演習
 
MagicOnion入門
MagicOnion入門MagicOnion入門
MagicOnion入門
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
RDF Semantic Graph「RDF 超入門」
RDF Semantic Graph「RDF 超入門」RDF Semantic Graph「RDF 超入門」
RDF Semantic Graph「RDF 超入門」
 
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしようPHP-FPM の子プロセス制御方法と設定をおさらいしよう
PHP-FPM の子プロセス制御方法と設定をおさらいしよう
 
Javaでつくる本格形態素解析器
Javaでつくる本格形態素解析器Javaでつくる本格形態素解析器
Javaでつくる本格形態素解析器
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
Humble Object Patternな話
Humble Object Patternな話Humble Object Patternな話
Humble Object Patternな話
 
Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話Swaggerでのapi開発よもやま話
Swaggerでのapi開発よもやま話
 
gRPC入門
gRPC入門gRPC入門
gRPC入門
 
REST API のコツ
REST API のコツREST API のコツ
REST API のコツ
 
例外設計における大罪
例外設計における大罪例外設計における大罪
例外設計における大罪
 
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
MongoDBとAjaxで作る解析フロントエンド&GraphDBを用いたソーシャルデータ解析
 
DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容DeNAの最新のマスタデータ管理システム Oyakata の全容
DeNAの最新のマスタデータ管理システム Oyakata の全容
 
組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術組織にテストを書く文化を根付かせる戦略と戦術
組織にテストを書く文化を根付かせる戦略と戦術
 
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
 

Viewers also liked

日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみたYuusuke Takeuchi
 
しごとで使うTitanium 第2版
しごとで使うTitanium 第2版しごとで使うTitanium 第2版
しごとで使うTitanium 第2版忠利 花崎
 
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編まべ☆てっく運営
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫Yuta Imai
 
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)Yohei Hamada
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方光晶 上原
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~infinite_loop
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビューTakafumi ONAKA
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テストTakahiro Moteki
 

Viewers also liked (11)

日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
日曜プログラマーが
1週間くらいで通信対戦ゲームを作ってみた
 
しごとで使うTitanium 第2版
しごとで使うTitanium 第2版しごとで使うTitanium 第2版
しごとで使うTitanium 第2版
 
Fuelphp1.8を始めたい
Fuelphp1.8を始めたいFuelphp1.8を始めたい
Fuelphp1.8を始めたい
 
PHP超入門@LL温泉
PHP超入門@LL温泉PHP超入門@LL温泉
PHP超入門@LL温泉
 
負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編負荷テストを行う際に知っておきたいこと 初心者編
負荷テストを行う際に知っておきたいこと 初心者編
 
オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫オンラインゲームの仕組みと工夫
オンラインゲームの仕組みと工夫
 
負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)負荷がたかいいんだから~♪(仮)
負荷がたかいいんだから~♪(仮)
 
自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方自宅で出来る!ゲームサーバの作り方
自宅で出来る!ゲームサーバの作り方
 
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
大規模ソーシャルゲームを支える技術~PHP+MySQLを使った高負荷対策~
 
「速」を落とさないコードレビュー
「速」を落とさないコードレビュー「速」を落とさないコードレビュー
「速」を落とさないコードレビュー
 
[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト[社内勉強会]ELBとALBと数万スパイク負荷テスト
[社内勉強会]ELBとALBと数万スパイク負荷テスト
 

Similar to PHPで大規模ブラウザゲームを開発してわかったこと

大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法佐久本正太
 
目指せ1秒切り!ECサイト表示高速化のワザ
目指せ1秒切り!ECサイト表示高速化のワザ目指せ1秒切り!ECサイト表示高速化のワザ
目指せ1秒切り!ECサイト表示高速化のワザKohei MATSUSHITA
 
awsを学ぶ上で必要となる前提知識(DB)
awsを学ぶ上で必要となる前提知識(DB)awsを学ぶ上で必要となる前提知識(DB)
awsを学ぶ上で必要となる前提知識(DB)聡 大久保
 
AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -SORACOM, INC
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Masahiro Nagano
 
初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなしOonishi Takaaki
 
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceYAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceKazuho Oku
 
20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~
20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~
20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~Iwasaki Noboru
 
[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)
[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)
[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)Amazon Web Services Japan
 
SQL Azure のシームレスな管理
SQL Azure のシームレスな管理SQL Azure のシームレスな管理
SQL Azure のシームレスな管理junichi anno
 
Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築伊藤 祐策
 
A 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみた
A 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみたA 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみた
A 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみたGoAzure
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイントKentaro Matsui
 
Awsのクラウドデザインパターンをwindows azureに持ってきてみた
Awsのクラウドデザインパターンをwindows azureに持ってきてみたAwsのクラウドデザインパターンをwindows azureに持ってきてみた
Awsのクラウドデザインパターンをwindows azureに持ってきてみたSunao Tomita
 
忍者ツールズのCouchbase導入事例
忍者ツールズのCouchbase導入事例忍者ツールズのCouchbase導入事例
忍者ツールズのCouchbase導入事例Kenichi Tsunokawa
 
Guide to Cassandra for Production Deployments
Guide to Cassandra for Production DeploymentsGuide to Cassandra for Production Deployments
Guide to Cassandra for Production Deploymentssmdkk
 
AWSクラウドデザインパターン(CDP) - 概要編 -
AWSクラウドデザインパターン(CDP) - 概要編 - AWSクラウドデザインパターン(CDP) - 概要編 -
AWSクラウドデザインパターン(CDP) - 概要編 - SORACOM, INC
 

Similar to PHPで大規模ブラウザゲームを開発してわかったこと (20)

大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
MySQL負荷分散の方法
MySQL負荷分散の方法MySQL負荷分散の方法
MySQL負荷分散の方法
 
目指せ1秒切り!ECサイト表示高速化のワザ
目指せ1秒切り!ECサイト表示高速化のワザ目指せ1秒切り!ECサイト表示高速化のワザ
目指せ1秒切り!ECサイト表示高速化のワザ
 
JAWS-UG-Kyoto-2nd
JAWS-UG-Kyoto-2ndJAWS-UG-Kyoto-2nd
JAWS-UG-Kyoto-2nd
 
awsを学ぶ上で必要となる前提知識(DB)
awsを学ぶ上で必要となる前提知識(DB)awsを学ぶ上で必要となる前提知識(DB)
awsを学ぶ上で必要となる前提知識(DB)
 
AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -AWSクラウドデザインパターン(CDP) - Eコマース編 -
AWSクラウドデザインパターン(CDP) - Eコマース編 -
 
Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14Web Operations and Perl kansai.pm#14
Web Operations and Perl kansai.pm#14
 
初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし初心者向け負荷軽減のはなし
初心者向け負荷軽減のはなし
 
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web serviceYAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
YAPC::Asia 2008 Tokyo - Pathtraq - building a computation-centric web service
 
20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~
20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~
20121115 オープンソースでハイアベイラビリティ! ~クラスタ管理の設計構築ハウツー&エンジニア思考力~
 
[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)
[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)
[AWS Summit 2012] クラウドデザインパターン#3 CDP Eコマース編 (EC-CUBE)
 
SQL Azure のシームレスな管理
SQL Azure のシームレスな管理SQL Azure のシームレスな管理
SQL Azure のシームレスな管理
 
Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築Lv1から始めるWebサービスのインフラ構築
Lv1から始めるWebサービスのインフラ構築
 
A 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみた
A 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみたA 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみた
A 1-3 awsのクラウドデザインパターンをwindows-azureに持ってきてみた
 
地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント地方企業がソーシャルゲーム開発を成功させるための10のポイント
地方企業がソーシャルゲーム開発を成功させるための10のポイント
 
Dsas周りのお話
Dsas周りのお話Dsas周りのお話
Dsas周りのお話
 
Awsのクラウドデザインパターンをwindows azureに持ってきてみた
Awsのクラウドデザインパターンをwindows azureに持ってきてみたAwsのクラウドデザインパターンをwindows azureに持ってきてみた
Awsのクラウドデザインパターンをwindows azureに持ってきてみた
 
忍者ツールズのCouchbase導入事例
忍者ツールズのCouchbase導入事例忍者ツールズのCouchbase導入事例
忍者ツールズのCouchbase導入事例
 
Guide to Cassandra for Production Deployments
Guide to Cassandra for Production DeploymentsGuide to Cassandra for Production Deployments
Guide to Cassandra for Production Deployments
 
AWSクラウドデザインパターン(CDP) - 概要編 -
AWSクラウドデザインパターン(CDP) - 概要編 - AWSクラウドデザインパターン(CDP) - 概要編 -
AWSクラウドデザインパターン(CDP) - 概要編 -
 

More from Kentaro Matsui

テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
20201113_バーチャルキャストが創り出すVRの未来
20201113_バーチャルキャストが創り出すVRの未来20201113_バーチャルキャストが創り出すVRの未来
20201113_バーチャルキャストが創り出すVRの未来Kentaro Matsui
 
Virtual Cast 設立資料
Virtual Cast 設立資料Virtual Cast 設立資料
Virtual Cast 設立資料Kentaro Matsui
 
札幌移住計画夏の企業見学会2018説明資料
札幌移住計画夏の企業見学会2018説明資料札幌移住計画夏の企業見学会2018説明資料
札幌移住計画夏の企業見学会2018説明資料Kentaro Matsui
 
札幌移住計画夏の企業見学会2017説明会
札幌移住計画夏の企業見学会2017説明会札幌移住計画夏の企業見学会2017説明会
札幌移住計画夏の企業見学会2017説明会Kentaro Matsui
 
札幌移住計画のご紹介
札幌移住計画のご紹介札幌移住計画のご紹介
札幌移住計画のご紹介Kentaro Matsui
 
Skypeボット マザーゆっくり
Skypeボット マザーゆっくりSkypeボット マザーゆっくり
Skypeボット マザーゆっくりKentaro Matsui
 
チーム開発をうまく行うためのコーディング規約論
チーム開発をうまく行うためのコーディング規約論チーム開発をうまく行うためのコーディング規約論
チーム開発をうまく行うためのコーディング規約論Kentaro Matsui
 
地方企業がリモートで首都圏のお仕事をこなすための10個のポイント
地方企業がリモートで首都圏のお仕事をこなすための10個のポイント地方企業がリモートで首都圏のお仕事をこなすための10個のポイント
地方企業がリモートで首都圏のお仕事をこなすための10個のポイントKentaro Matsui
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみようKentaro Matsui
 
Gps座標を短い文字列で扱えるGeo Hashが面白い
Gps座標を短い文字列で扱えるGeo Hashが面白いGps座標を短い文字列で扱えるGeo Hashが面白い
Gps座標を短い文字列で扱えるGeo Hashが面白いKentaro Matsui
 
PHPを使って3分で作る3キャリア対応ケータイサイト
PHPを使って3分で作る3キャリア対応ケータイサイトPHPを使って3分で作る3キャリア対応ケータイサイト
PHPを使って3分で作る3キャリア対応ケータイサイトKentaro Matsui
 
モバイル版Googleマップのちょっと進んだ使い方
モバイル版Googleマップのちょっと進んだ使い方モバイル版Googleマップのちょっと進んだ使い方
モバイル版Googleマップのちょっと進んだ使い方Kentaro Matsui
 
ケータイサイトのはなし(入門編)
ケータイサイトのはなし(入門編)ケータイサイトのはなし(入門編)
ケータイサイトのはなし(入門編)Kentaro Matsui
 

More from Kentaro Matsui (15)

テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
20201113_バーチャルキャストが創り出すVRの未来
20201113_バーチャルキャストが創り出すVRの未来20201113_バーチャルキャストが創り出すVRの未来
20201113_バーチャルキャストが創り出すVRの未来
 
Virtual Cast 設立資料
Virtual Cast 設立資料Virtual Cast 設立資料
Virtual Cast 設立資料
 
札幌移住計画夏の企業見学会2018説明資料
札幌移住計画夏の企業見学会2018説明資料札幌移住計画夏の企業見学会2018説明資料
札幌移住計画夏の企業見学会2018説明資料
 
札幌移住計画夏の企業見学会2017説明会
札幌移住計画夏の企業見学会2017説明会札幌移住計画夏の企業見学会2017説明会
札幌移住計画夏の企業見学会2017説明会
 
札幌移住計画のご紹介
札幌移住計画のご紹介札幌移住計画のご紹介
札幌移住計画のご紹介
 
Skypeボット マザーゆっくり
Skypeボット マザーゆっくりSkypeボット マザーゆっくり
Skypeボット マザーゆっくり
 
チーム開発をうまく行うためのコーディング規約論
チーム開発をうまく行うためのコーディング規約論チーム開発をうまく行うためのコーディング規約論
チーム開発をうまく行うためのコーディング規約論
 
地方企業がリモートで首都圏のお仕事をこなすための10個のポイント
地方企業がリモートで首都圏のお仕事をこなすための10個のポイント地方企業がリモートで首都圏のお仕事をこなすための10個のポイント
地方企業がリモートで首都圏のお仕事をこなすための10個のポイント
 
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
 
Gps座標を短い文字列で扱えるGeo Hashが面白い
Gps座標を短い文字列で扱えるGeo Hashが面白いGps座標を短い文字列で扱えるGeo Hashが面白い
Gps座標を短い文字列で扱えるGeo Hashが面白い
 
PHPを使って3分で作る3キャリア対応ケータイサイト
PHPを使って3分で作る3キャリア対応ケータイサイトPHPを使って3分で作る3キャリア対応ケータイサイト
PHPを使って3分で作る3キャリア対応ケータイサイト
 
20090828 Webconlocal
20090828 Webconlocal20090828 Webconlocal
20090828 Webconlocal
 
モバイル版Googleマップのちょっと進んだ使い方
モバイル版Googleマップのちょっと進んだ使い方モバイル版Googleマップのちょっと進んだ使い方
モバイル版Googleマップのちょっと進んだ使い方
 
ケータイサイトのはなし(入門編)
ケータイサイトのはなし(入門編)ケータイサイトのはなし(入門編)
ケータイサイトのはなし(入門編)
 

PHPで大規模ブラウザゲームを開発してわかったこと

  • 1. PHPで 大規模ブラウザゲームを 開発してわかったこと LOCAL PHP部 株式会社インフィニットループ ke-tai.org 松井 健太郎
  • 2. 自己紹介 松井 健太郎 ・ LOCAL PHP部 部長 ・ 株式会社インフィニットループ 代表 ・ ke-tai.org 管理人 ・ コーラが好き
  • 4. 本日の内容 1. ソーシャルゲーム大流行 2. 困った!ゲームなんて作ったことないぞ!? - 通常の案件とゲーム製作の違い 3. なぜPHPを使ってるの? 4. ゲーム向けの基本設計とサーバ構成 5. PHP実装のポイント 6. データベース設計で注意するところ 7. これが一番の問題!負荷対策について 8. その他こんなところに苦労した
  • 5. ソーシャルゲーム大流行 ・ それまでも兆しはあった → ブラウザゲームというジャンルは以前から存在していた → 海外での利用者数増加 ・ はじまりはmixiアプリから → 2009年8月mixiアプリオープン → 2009年10月mixiアプリモバイルオープン サンシャイン牧場 ・ 国内ウェブコンテンツ制作の業者がこぞってゲーム開発に参入 ・ モバゲー、GREE、大手ゲーム会社などを巻き込んでの大戦争に ・ 2010年には1000億円市場になると言われている 2010 mixi IR資料より
  • 8. 困った!ゲームなんて 作ったことないぞ!? ・ 弊社にとっても初のゲーム開発 - それまでに作ったことがあるもの  ▼ウェブサイト向けの動的コンテンツ  ▼業務用のウェブアプリケーション ・ 調べてみると基本動作は同じ  ▼HTMLとCSSで作られたページの遷移  ▼DBへの登録・修正・削除  ▼JavaScriptによる装飾処理 ・ サーバ構成もウェブアプリケーションと大差は無い  ▼通常のLAMP構成  ▼ただし負荷対策にはしっかりとした考慮が必要 通常のウェブアプリケーションの基礎が  → 通常のウェブアプリケーションの基礎が   しっかり出来ていれば しっかり出来ていれば大丈夫   しっかり出来ていれば大丈夫
  • 9. なぜPHPを使ってるの? ・ もちろん弊社がPHPが得意というのはあるが… ・ 数多くの高負荷運用の実績がある ・ 開発スタッフ集めが容易(開発スピードが求められる) ・ 処理速度がわりと高速、APCなどのアクセラレータで更 にスピードアップ ・ プログラム更新の容易さ。メンテナンスなしでゲームを動 かしながら柔軟にアップ作業ができる ・ PHPだけが特段ゲーム向きの言語というわけではない
  • 10. 基本設計で気をつけたいところ ・ 特に通常案件と大きく変わるわけではない - いわゆるLAMP構成(Linux, Apache, MySQL, PHP) ・ 運用後どれだけ利用者が増えるか予測がしにくいので、 いつ人が増えても破綻をきたさない設計 - 「利用者数が増えてきてから対処」では間に合わない - サーバを追加することで対処可能なように ・ 利用数の増加スピードには大きな波がある - ソーシャルアプリならではのクチコミやランキング入りなど - サーバ追加の容易さが求められる ・ 落とさないサーバ作りは大変 - 重要サーバのみを守り、他はどんどん落とすという方針
  • 11. サーバ構成例 Amazon EC2上に構築 上 HTTPアクセス ・ squid(ロードバランサー) ロードバランサ ・ Apache (squid) HTTP振り分け ・ PHP+APC ・ ・ ・ バッチ処理サーバ Webサーバ Webサーバ Webサーバ ・ MySQL (Apache) (Apache) (Apache) DBアクセス EC2によるオー EC2によるオー トスケーリング ・ memcached キャッシュサーバ (memcached) 負荷に で、負荷に応じ 台数が て台数が自動 ・ syslogd(ログサーバ) ログサーバ DBマスター (MySQL) 増減する 増減する レプリケーション (syslogd) ・ ・ ・ DBスレイブ DBスレイブ DBスレイブ (MySQL) (MySQL) (MySQL)
  • 12. PHP実装のポイント(1) ・ 既成フレームワークは使っていない → 負荷が高すぎた際に手が出せない恐れがあるため → ただし工数削減のために導入もあり ・ テンプレートエンジンにはSmartyを利用 → 遅いと言われているがベンチを取ったところ別に遅くない → デザイン連携がしやすい ・ クラス化が重要 → 通常の案件と比べると、遥かにクラス化の効果が高い → ゲームは再利用が多いので、クラス化と相性が良いと思われる → 例えばポーションクラスを継承してハイポーションのアイテムを作成など
  • 13. PHP実装のポイント(2) ・ ログはしっかり取る → PEAR::Logを使用している → ログレベルを可変にできるように → 規模が大きくなるほどバグの把握と再現が難しくなる ・ 実行されるSQLはすべて管理できるようにする → ごく一部の遅いSQLが、DBサーバの負荷の大半を占める → O/Rマッパーなど自動でSQLが生成されるようなものは利用しない ・ DBのロックはしっかり行う → 当たり前だがテーブルロックは使えない → 行ロック(FOR UPDATE)を使用 → しっかり行わないと同時操作や高負荷時にのみ起こるバグが残ってしまう ・ その他大きく変わったことはしていない、とにかく基本が大事
  • 14. データベース設計の注意(1) ・ 基本的には通常の案件と同じでOK → ゲームならではの特殊な設計があるわけではない → 負荷を意識して設計することが必要 ・ テーブルは必ずしもキレイに正規化されるわけではない → 高負荷の部分は、あえて冗長な構造にしたり、キャッシュテーブルを設ける ・ DB容量の増加はなるべく抑えるようにする → データ量を少なくするのは、地味なようで効果がある → なるべくオンメモリで動作するように → DBスレイブをRAMディスク上で動作させることができる → ログテーブルなどはバッチで定期的に書き出して削除する
  • 15. データベース設計の注意(2) ・ ロックを考慮して設計 → ロックの使用方法によってはCPUパワーを使いきれない → ロック待ちをなるべく減らすように → 使用するデータベースソフトや分離レベルによって挙動が微妙に異なるのを 理解する 例:プレイヤーのステータス(HP, MP)を格納するテーブルがあったとして、左のように設計してしまうと、 player_id単位で行ロックがかかるため、HPとMPを同時に更新できない。 (下記の例だと魔法を使いながら他者から攻撃を受けることができない) SELCT * FROM player_tbl WHER player_id = x FOR UPDATE; player_tbl player_hp_tbl ・player_id ・player_id ・name ・hp ・hp それぞれに対して ・mp player_mp_tbl 行ロック&更新が可能 ・player_id MP更新中は、HP更 新が待たされる ・mp
  • 16. これが一番の問題! 負荷対策について ・ 負荷対策にも色々ある ・ ウェブサーバの負荷対策 → CPU負荷の軽減 → 転送量軽減 ・ DBサーバの負荷対策 → DBスレイブの負荷対策 → DBマスターの負荷対策 ・ キーバリューストアの導入 → memcached導入の悩ましい問題
  • 17. 負荷対策について ウェブサーバの負荷対策(1) ・ Apacheのチューニング → httpd.confなどの設定値を見直しチューニングする ・ PHPアクセラレータを導入 → これ無しの運用は考えられない(入れない理由がない) → 比較・評価の結果、APCを利用している ・ スケールアウトで対応 → ウェブサーバの台数を増やし、それをLBで振り分けることで対応 → セッションの共有はmemcachedを利用  (他にもDBで共有、LB側で対応などの方法がある) ・ PHPプログラムの改善でウェブサーバの負荷を下げるのは 結構難しく、地道な作業が必要
  • 18. 負荷対策について ウェブサーバの負荷対策(2) ・ アプリサーバとは別に専用の画像サーバを用意する → 画像、CSS、JavaScriptはアプリサーバとは別に設置する → アプリ側で画像参照先を切り替えられるようにしておく 例:<img src=“{$IMG_DIR}/img/example.jp” /> ・ 転送量を減らす → ob_gzhandlerで出力を圧縮 → 画像のサイズを小さく → CSSやJSはツールを利用して圧縮する → HTMLのコメントやインデントは削除 ※Smartyのコメント化してしまうと良い 例: <!– comment -> → {*<!– comment ->*}
  • 19. 負荷対策について ウェブサーバの負荷対策(3) ・ 画像などのキャッシュは強めに設定する 例: ExpiresActive On ExpiresDefault "access plus 3 days" ・ 任意でキャッシュクリアできる仕掛けを用意する 例: <img src=“/20100401-01/img/sample.jpg” /> のように画像パスに変更可能な文字列を入れておく 画像更新のタイミングでインクリメント <IfModule mod_rewrite.c> RewriteEngine On シンボリックリンクをはるか、mod_rewriteで RewriteBase / 日付の部分を無視するようにしておく。 RewriteRule ^[0-9]{8}-[0-9]+/(.*) $1 </IfModule>
  • 20. 負荷対策 DBスレイブの負荷対策 ・ MySQLのチューニング → my.cnfなどの設定値を見直しチューニングする ・ スケールアウトで対応 → MySQLのレプリケーション機能で台数を増やして対応 ・ マスターサーバからスレイブサーバの伝達遅延対策 → これが起こるのは非同期レプリケーションの宿命 → データベースの容量はなるべく小さく、オンメモリ内に収まるように → RAMディスクやSSD上にDB領域を作成して対応 ・ 重いクエリを修正する → スロークエリのログをチェックし、重い順に対策していく → これをひたすら繰り返す(最初のうちは負荷はみるみる下がる)
  • 21. 負荷対策 DBマスターの負荷対策 ・ DBマスターの負荷対策は難しい → スケールアウトがしずらい → マスターサーバだけ強化しても、スレイブがついていけない ・当たり前のことを淡々と → 不要なクエリが実行されていないかを調査 → スロークエリのログを取って、重い順に対策していく → トランザクションの時間をなるべく短くなるようにプログラムを調整 ・ それでもダメなら → ゲームの仕様で調整できる部分がないか検討する → マスター分割を検討、ただし開発工数の増加を招きやすい → MySQL Clusterってどうなんだろう
  • 22. キーバリューストアの導入 ・ キーバリューストア(memcachedなど)の導入は意外と悩ましい ・ ゲームではキャッシュが使いづらい → 参照がほとんどのWebコンテンツ(例えばニュース、掲示板など)とは違う → キャッシュするのは簡単だが、キャッシュクリア処理が難しい ・ トランザクション中はキャッシュを使いづらい → トランザクション中はmemcached上のデータをあてにできない → 利用できるのは変更が入らないマスタ類だけ → DBマスターサーバの負荷軽減にはあまり繋がらない → DBのロールバックに対する対処が必要 ・ 実装やデバッグのコストが増えやすい → サーバ代と開発とどちらにコストをかけるかの問題 → 実はDBもうまく使えば結構早い → DeNAもMySQLメインのアプローチでやってるらしい? 参考: @IT Special PR:600億PVもMySQLで! モバゲーのインフラ底力(http://www.atmarkit.co.jp/ad/dena/dena1004/index.html)
  • 23. その他こんなところに苦労した ・ APCの不可解な挙動 → APCのキャッシュが更新されず、プログラムがアップされない → touchコマンドでタイムスタンプを更新すると直る → rsyncに「--no-times」オプションを付けることでひとまず解決 ・ プログラム規模が大きくなることへの対処 → コーディング規約とルールをしっかりと策定することが大事 ・ AmazonEC2のトラブル → ゲームとクラウドの相性は良いが、まだまだ安定していない → 国内含め他のクラウドも似たりよったり、まだまだこれから ・ 技術者としてのこだわりと、実装のコストと妥協 → プログラムが汚くなることもあるよね → 基本動いているものがえらい → 時には仕様を曲げてもらうことも必要かも
  • 24. FAQ(1) Q. ゲーム開発は難しくないですか? A. 簡単か難しいかと言われたら、結構難しいです。 テスト環境で動かすだけなら比較的簡単ですが、実際にユーザを 入れてちゃんと動くものを作るのは大変です。 今もわからないことがいっぱいです。 Q. AmazonEC2を使用しているそうですが、使ってみてどうですか? A. サーバがすぐに増設できる、負荷に合わせて自動でサーバを増 減させることができる、など長所も多くありますが、安定度という点 ではまだまだと思います。 適材適所で使い分ける必要があるのではないでしょうか。
  • 25. FAQ(2) Q. ゲーム開発は面白いですか? A. はい、通常案件の倍増しくらいで面白いです。 技術的な面はもちろんですが、コミュニティなどで利用者の反応が すぐに見られる点が特に楽しいです。仕事中に堂々とゲームがで きるというメリットもあります(笑) Q. バグ技を教えてください A. バグの内容にもよりますが、悪用できるようなバグはすぐ対処さ れるため、知りません。 もしバグ技を見つけたらブログなどには書かないで、どうかこっそ りと運営までご連絡をお願いします m(_ _)m
  • 26. FAQ(3) Q. ゲームを作る上で一番重要なことは何ですか? A. クライアントから言われた一言をご紹介します。 「既存WEBエンジニアからのゲーム転身で大事なのは、  参考ゲームをやって面白さを理解してくれること。  ゲームは仕様を読んでもわからない。」
  • 27. まとめ ・ ソーシャルゲーム開発は難しいところもあるが面白い。 ゲーム開発の経験がない人でも意外と何とかなる。 ・ 負荷対策が大変。基本は台数でカバーできる作りに、そ れ以外はできることから淡々と。 ・ 設計は開発コストとサーバコストのバランスの見極めが 重要。 ・ 基礎が大事、負荷対策やロックなどの基本的なところを しっかりと身につけることが必要。
  • 28. 最後に LOCAL PHP部のご紹介 LOCALの一部のメンバでPHPのイベントをゆるく、 ながくやっていこうか、という会です。 大体二ヶ月に一度くらいのペースで、 札幌市内で勉強会を開催しています。 LOCAL PHP部のページ: http://php.local.gr.jp/ Googleグループ:  http://groups.google.co.jp/group/local-php