Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Heroku で作る
スケーラブルな 
PHP アプリケーション

23,953 views

Published on

2014/06/19 第16回関西PHP勉強会

Published in: Internet

Heroku で作る
スケーラブルな 
PHP アプリケーション

  1. 1. 2014/06/19 shin1x1 第16回関西PHP勉強会 Heroku で作る
 スケーラブルな 
 PHP アプリケーション
  2. 2. Agenda (c) 2014 Masashi Shinbara @shin1x1 • Heroku とは • PHPアプリケーションのデプロイ • スケーラブルな構成を作る • 大事なこと • まとめ
  3. 3. Herokuとは (c) 2014 Masashi Shinbara @shin1x1
  4. 4. • Salesforce 社が運営する PaaS • 2007年サービスイン • 3,000,000以上のアプリケーションが稼働 • Ruby をはじめとして、複数言語の実行環境 • PHPが 2014/04 に正式対応 (c) 2014 Masashi Shinbara @shin1x1 Herokuとは
  5. 5. • git push だけで、デプロイ完了 • ミドルウェアのインストールや設定などが不要 • 無料枠があり、かなり試すことができる • 豊富な動作実績があり、ノウハウも多数ある (c) 2014 Masashi Shinbara @shin1x1 Herokuのうれしいところ
  6. 6. • PHP 5.5.12 / 5.5.13 • HHVM 3.1.0 • 拡張も追加可能(mbstring, memcached等) • Composer が使える (c) 2014 Masashi Shinbara @shin1x1 HerokuでのPHP
  7. 7. • PostgreSQL / MySQL / KVS • メール送受信 • ログ転送 • 監視 • キュー • etc (c) 2014 Masashi Shinbara @shin1x1 豊富なアドオン
  8. 8. PHPアプリケーションの デプロイ (c) 2014 Masashi Shinbara @shin1x1
  9. 9. (c) 2014 Masashi Shinbara @shin1x1 PHPアプリケーション $ ls! index.php! ! $ cat index.php! <?php phpinfo();! ! $ git init! $ git add .; git commit -m “init”
  10. 10. 1. heroku.com でサインアップ(サインアップ) 2. Heroku Toolbelt インストール 3. Heroku でアプリケーションを作成 4. PHPアプリケーションをデプロイ (c) 2014 Masashi Shinbara @shin1x1 Quick Start
  11. 11. (c) 2014 Masashi Shinbara @shin1x1 サインアップ https://id.heroku.com/signup
  12. 12. (c) 2014 Masashi Shinbara @shin1x1 Heroku Toolbelt • Heroku クライアントツールセット • OSX, Windows, Debian / Ubuntsu • Heroku の操作を CLI で行う • Web 画面でも可能だが、あると便利
  13. 13. (c) 2014 Masashi Shinbara @shin1x1 Heroku Toolbelt https://devcenter.heroku.com/articles/quickstart
  14. 14. (c) 2014 Masashi Shinbara @shin1x1 Heroku Toolbelt $ heroku login! Enter your Heroku credentials.! Email: shin1x1@gmail.com! Password (typing will be hidden):! Two-factor code: xxxxx! Authentication successful.! • ログイン 2要素認証も可能
  15. 15. (c) 2014 Masashi Shinbara @shin1x1 アプリケーション作成 ! $ heroku create -r heroku! Creating xxx-xxxx-xxxx... done, stack is cedar! http://xxx-xxxx-xxxx.herokuapp.com/ | git@heroku.com:xxx-xxxx-xxxx.git! •アプリ名は、ランダムで自動生成 •̶app NAME で、アプリ名を指定することも可能 •-r heroku で、「git remote add heroku URL」を実行
  16. 16. (c) 2014 Masashi Shinbara @shin1x1 デプロイ ! $ git push heroku master! Initializing repository, done.! Counting objects: 3, done.! Writing objects: 100% (3/3), 218 bytes | 0 bytes/s, done.! Total 3 (delta 0), reused 0 (delta 0)
 ! (snip)! 
 -----> Setting up runtime environment...! - PHP 5.5.12! - Apache 2.4.9! - Nginx 1.4.6!
  17. 17. (c) 2014 Masashi Shinbara @shin1x1 完了! ! $ heroku open!
  18. 18. (c) 2014 Masashi Shinbara @shin1x1 管理画面
  19. 19. スケーラブルな構成を作る (c) 2014 Masashi Shinbara @shin1x1
  20. 20. (c) 2014 Masashi Shinbara @shin1x1 アプリケーション • 画像アップロードサイト • ログイン認証 • 画像アップロード • Laravel 4.2 https://github.com/shin1x1/laravel-on-heroku
  21. 21. (c) 2014 Masashi Shinbara @shin1x1 アプリケーション https://github.com/shin1x1/laravel-on-heroku
  22. 22. (c) 2014 Masashi Shinbara @shin1x1 シンプルな構成 Apache / PHP Log DB Session File
  23. 23. (c) 2014 Masashi Shinbara @shin1x1 シンプルな構成 • 全てが 1 台のサーバにある • Apache(nginx) / PHP / DB etc • スケールアップしかできない
  24. 24. (c) 2014 Masashi Shinbara @shin1x1 Apache / PHP Log DB Session File スケーラブルな構成
  25. 25. (c) 2014 Masashi Shinbara @shin1x1 スケーラブルな構成 DB FileSession Log Apache / PHP
  26. 26. (c) 2014 Masashi Shinbara @shin1x1 スケーラブルな構成 Apache / PHP DB FileSession Log Apache / PHP
  27. 27. (c) 2014 Masashi Shinbara @shin1x1 スケーラブルな構成 Apache / PHP DB FileSession Log Apache / PHP Apache / PHP
  28. 28. (c) 2014 Masashi Shinbara @shin1x1 Herokuでの構成 Apache / PHP DB FileSession Log Apache / PHP Apache / PHP Dyno
  29. 29. (c) 2014 Masashi Shinbara @shin1x1 Herokuでの構成 Apache / PHP DB FileSession Log Apache / PHP Apache / PHP Dyno Dyno Dyno
  30. 30. (c) 2014 Masashi Shinbara @shin1x1 Herokuでの構成 Apache / PHP DB FileSession Log Apache / PHP Apache / PHP Dyno Dyno Dyno 3 Dynos
  31. 31. (c) 2014 Masashi Shinbara @shin1x1 Herokuでの構成 Apache / PHP DB FileSession Log Apache / PHP Apache / PHP Add-ons Add-ons
  32. 32. (c) 2014 Masashi Shinbara @shin1x1 Herokuでの構成 Apache / PHP DB FileSession Log Apache / PHP Apache / PHP
  33. 33. (c) 2014 Masashi Shinbara @shin1x1 スケーラブルな構成 • Dyno(PHPサーバ)は、ステートレスにする • Dyno を増やしてスケールさせる • アプリケーションデータは、アドオンに置く
  34. 34. (c) 2014 Masashi Shinbara @shin1x1 データベース • Heroku Postgres(無料枠あり) • 接続情報を環境変数から取得 DATABASE_URL=postgres://xxxxx:yyyyyy@ec2-nnn-nnn- nnn-nnn.compute-1.amazonaws.com:5432/XXXXXXX • parse_url() でパース • アドオンは、ほぼこのパターン
  35. 35. (c) 2014 Masashi Shinbara @shin1x1 データベース <?php! $url = parse_url(getenv('DATABASE_URL')); array(6) {! 'scheme' =>! string(8) "postgres"! 'host' =>! string(43) "ec2-nnn-nnn-nnn-nnn.compute-1.amazonaws.com"! 'port' =>! int(5432)! 'user' =>! string(4) "user"! 'pass' =>! string(4) "pass"! 'path' =>! string(7) "/dbname"! }
  36. 36. (c) 2014 Masashi Shinbara @shin1x1 データベース <?php! $url = parse_url(getenv('DATABASE_URL'));! ! $dsn = sprintf(‘pgsql:host=%s;dbname=%s',! $url['host'], substr($url['path'], 1));! ! $pdo = new PDO($dsn, $url['user'], $url['pass']); • PDO の例
  37. 37. (c) 2014 Masashi Shinbara @shin1x1 データベース <?php! $postgresqlUrl = parse_url(getenv('DATABASE_URL'));! ! return [! 'default' => 'pgsql',! 'connections' => [! 'pgsql' => [! 'driver' => 'pgsql',! 'host' => $postgresqlUrl['host'],! 'database' => substr($postgresqlUrl['path'], 1),! 'username' => $postgresqlUrl['user'],! 'password' => $postgresqlUrl['pass'],! 'charset' => 'utf8',! 'prefix' => '',! 'schema' => 'public',! ],! ],! ]; • Laravel の例
  38. 38. (c) 2014 Masashi Shinbara @shin1x1 データベース http://qiita.com/shin1x1/items/68732dcf02a93c0a0fbb
  39. 39. (c) 2014 Masashi Shinbara @shin1x1 ログイン認証(セッション) • Redis でセッション情報を共有 • Redis To Go(無料枠あり) • 接続情報を環境変数から取得 • composer.json で redis を有効に REDISTOGO_URL=redis:// redistogo:xxxxxxxxxxxxxxx@xxxxx.redistogo.com:PORT/
  40. 40. (c) 2014 Masashi Shinbara @shin1x1 ログイン認証(セッション) <?php! $url = parse_url(getenv('REDISTOGO_URL'));! ! $redisServer = sprintf(‘tcp://%s:%d?auth=%s',! $url['host'], $url['port'], $url['pass']);! ! ini_set('session.save_handler', 'redis');! ini_set('session.save_path', $redisServer);! • redis セッションハンドラの例
  41. 41. (c) 2014 Masashi Shinbara @shin1x1 ログイン認証(セッション) http://qiita.com/shin1x1/items/43181cd0487c72cb87a3
  42. 42. (c) 2014 Masashi Shinbara @shin1x1 画像ファイル • S3 に保存(アドオンではない) • AWS SDK for PHP で実装 • 接続情報は、環境変数にセットしておくと良い • heroku config:set で環境変数をセット $ heroku config:set AWS_ACCESS_ID=xxxx! $ heroku config:set AWS_ACCESS_SECRET_KEY=xxxx
  43. 43. (c) 2014 Masashi Shinbara @shin1x1 ログ • ログは、stdout or stderr に出力 • PaperTail などのアドオンで保存 • 複数 Dyno のログをアドオンに集約 • monolog / file_put_contents()
  44. 44. (c) 2014 Masashi Shinbara @shin1x1 ログ
  45. 45. (c) 2014 Masashi Shinbara @shin1x1 デモ アクセスする Dyno が違う
  46. 46. (c) 2014 Masashi Shinbara @shin1x1 デモ アクセスする Dyno が違う
  47. 47. (c) 2014 Masashi Shinbara @shin1x1 デモ アクセスする Dyno が違う
  48. 48. (c) 2014 Masashi Shinbara @shin1x1 デモ アクセスする Dyno が違う
  49. 49. 大事なこと (c) 2014 Masashi Shinbara @shin1x1
  50. 50. (c) 2014 Masashi Shinbara @shin1x1 大事なこと • ファイルに保存したデータは消える!! • デプロイ、環境変数変更等の操作 • 1日1回の再起動時 • アクセスが無い場合、自動停止
 (Dyno が 1 台構成だとアクセスが無い時間は、
 自動でスリープする)
  51. 51. (c) 2014 Masashi Shinbara @shin1x1 ファイルが消える <?php! const FILE_PATH = '/tmp/file';! ! file_put_contents(FILE_PATH, ! date('Y/m/d H:i:s') . '<br>', FILE_APPEND);! ! echo file_get_contents(FILE_PATH); • file.php として、デプロイ
  52. 52. (c) 2014 Masashi Shinbara @shin1x1 ファイルが消える • ブラウザでアクセス
  53. 53. (c) 2014 Masashi Shinbara @shin1x1 ファイルが消える • 何度かリロード
  54. 54. (c) 2014 Masashi Shinbara @shin1x1 ファイルが消える $ echo “//foo” >> file.php! $ git add file.php; git commit -m “add comment”! $ git push heroku master • 変更して、再デプロイ • ブラウザでアクセスすると、消えている
  55. 55. (c) 2014 Masashi Shinbara @shin1x1 Herokuとは Heroku では、データファイルは消える
  56. 56. (c) 2014 Masashi Shinbara @shin1x1 Herokuとは Heroku では、データファイルは消える データは全て外部に逃す
  57. 57. (c) 2014 Masashi Shinbara @shin1x1 Herokuとは Heroku では、データファイルは消える データは全て外部に逃す スケーラブルなアプリケーションに!!
  58. 58. (c) 2014 Masashi Shinbara @shin1x1 Heroku では、データファイルは消える データは全て外部に逃す スケーラブルなアプリケーションに!! Herokuは スケーラブルな アプリケーション 矯正ギプス Herokuとは
  59. 59. まとめ (c) 2014 Masashi Shinbara @shin1x1
  60. 60. (c) 2014 Masashi Shinbara @shin1x1 まとめ • Heroku は、無料から使える • アドオンの活用が肝 • スケーラブルアプリケーション矯正ギプス
  61. 61. (c) 2014 Masashi Shinbara @shin1x1 参考 https://devcenter.heroku.com/categories/php
  62. 62. (c) 2014 Masashi Shinbara @shin1x1 参考 http://tatsu-zine.com/books/heropro
  63. 63. @shin1x1 (c) 2014 Masashi Shinbara @shin1x1

×