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.

App Engine と いまどきのPHP

459 views

Published on

Zend ExpressiveをGoogle App Engineで使ってみた

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

App Engine と いまどきのPHP

  1. 1. App Engine と いまどきのPHP 2016.06.19 1 - Zend Expressive + SendGrid でメール送信 -
  2. 2. プロローグ: GAE/PHPは大盛況 Google Cloud Platform Blog (Tuesday, June 16, 2015) App Engine for PHP is generally available. Build scalable apps, faster. http://pocket.co/sM8VRe Tens of thousands of developers already have built and deployed PHP applications on App Engine, with over 800M PHP queries handled each week. To put that in perspective, if we printed each PHP generated web page viewed on App Engine each day on a single sheet of paper and stacked them in a tower, it would be over seven miles high (about the same as the cruising altitude of a 747 jumbo jet). 何万もの開発者がApp Engine上でPHPアプリケーションを構築および展開し、App Engineが扱う各週の PHPのクエリは約8億件に達する。App EngineでPHPが生成しているWebページを紙にして積み上げると、 7マイル(約11,200m)を超える高さになる。 (ボーイング747の巡航高度くらいや) 2
  3. 3. プロローグ: GAE/PHPは大盛況?? ■ http://qiita.com/ に聞いてみる ■ tag:gae or tag:googleappengine ■ tag:php tag:gae or tag:php tag:googleappengine ■ tag:ruby tag:gae or tag:ruby tag:googleappengine ■ tag:Node.js tag:gae or tag:Node.js tag:googleappengine 3
  4. 4. 自己紹介1 ■ https://twitter.com/s0kam0 : そかも ■ フリーランスプログラマー (DB関連の方が好き) ■ 仕事では、Zend Framework(初代) を利用中 ■ スペシャルティ珈琲豆販売情報API「tilde.coffee」開発中 http://developer.tilde.coffee/ 4
  5. 5. 自己紹介2 ■ http://tilde.coffee (GAE/Python and Go) ■ PHPもやってみようかと。 ■ やるなら、いまどきのPHP (ただし、PHP5.5) ■ メール送信を試してみる(SendGrid) 5
  6. 6. いまどきのPHP PHP-FIG(Framework Interop Group) ■ 著名なPHPフレームワーク&CMSの 開発プロジェクトメンバーたちが PHPでの開発効率を高めるナレッジを共有するために発足したグループ ■ PHP Standard Recommendations(PSR) 提言と標準化した情報を公開している。 -> いまどきのPHP開発トレンド ■ http://www.php-fig.org/ 6
  7. 7. いまどきのPHP PSR-7 : HTTP Message Interface 7 出典: http://stackphp.com/
  8. 8. いまどきのPHP PSR-7 : HTTP Message Interface 8 ■ GETパラメータ取得 interface ServerRequestInterface extends RequestInterface { /** * Retrieve query string arguments. ---- (略) ---- * @return array */ public function getQueryParams(); }
  9. 9. いまどきのPHP PSR-7 : HTTP Message Interface 9 ■ POSTパラメータ取得 interface ServerRequestInterface extends RequestInterface { /** * Retrieve any parameters provided in the request body. ---- (略) ---- * @return null|array|object The deserialized body parameters, if any. * These will typically be an array or object. */ public function getParsedBody(); }
  10. 10. いまどきのPHP PSR-7 : HTTP Message Interface 10 ■ レスポンスステータス interface ResponseInterface extends MessageInterface { /** * Return an instance with the specified status code and, optionally, reason phrase. ---- (略) ---- */ public function withStatus($code, $reasonPhrase = ''); }
  11. 11. いまどきのPHP PSR-7 : HTTP Message Interface ■ 共通Interfaceの実装なので、フレームワークの移行、バー ジョンアップが容易 ■ PSR-7採用フレームワーク Zend-Expressive, Laravel, Slim, etc... 11
  12. 12. いまどきのPHP Middleware 12 Middleware (Session) Middleware (Authentication) Middleware Middleware (Log) Request Response
  13. 13. いまどきのPHP Middleware ■ 処理粒度を細かくできるので、テストしやすい ■ 疎結合なので、再利用可能 http://stackphp.com/middlewares/ 13
  14. 14. GAEとの相性 ■ インフラはおまかせ ■ Composeで Middlewareを集めて 積み上げるだけ (だけ?) 14
  15. 15. 採用したPHPフレームワーク Zend Expressive ■ PSR-7 準拠の PHP Micro Framework ■ PHPコアエンジン「Zend Engine」の開発者が創業した ゼンド・テクノロジーズ社が後援する オープンソースプロジェクト 15
  16. 16. 採用したPHPフレームワーク Zend Expressive ■ ひな型プロジェクトで始められる https://github.com/zendframework/zend-expressive-skeleton ■ GAEの制約があるので、そのままでは動作しない http://qiita.com/curious-eyes/items/fbc11e709f2121cc215e 16
  17. 17. GAEの制約回避 ■ file_put_contents() 設定ファイルをキャッシュ保持するために利用 ■ GAEではファイル書込ができないので Memcacheを利用するよう変更 17 $mc = new Memcache(); // setする場合 $mc->set($key, $value); // getする場合 $config = $mc->get($key);
  18. 18. GAEの制約回避 (php.ini) ■ timezoneの変更(Asia/Tokyo) ■ Warning対策 PHP Warning: php_sapi_name() has been disabled for security reasons. 18 date.timezone = Asia/Tokyo google_app_engine.enable_functions = "php_sapi_name, gc_enabled”
  19. 19. 利用ライブラリ Google Cloud Datastore ■ Google Cloud Datastore Library for PHP https://github.com/tomwalder/php-gds ■ App Engine SDK のプロトコルバッファを利用しているので ローカルPCの開発環境実行時でも、問題無く動作 ■ GAE/PHP から利用であれば、サービス アカウント キーの設定不要 19
  20. 20. 利用ライブラリ SendGrid ■ App Engine公式ドキュメントで紹介しているライブラリは古い (... 古くていいかも ...) ■ sendgrid-webapi-v3-php https://github.com/idimensionz/sendgrid-webapi-v3-php ■ 小さな不具合があるので... https://github.com/curious-eyes/sendgrid-webapi-v3- php/tree/patchUpdateProfile 20
  21. 21. 利用ライブラリ Google Cloud SQL ■ MySQLに接続する感覚で、PDO設定を行えば良い ■ Zend_DB で configファイルを定義するだけ ■ 今回は使ってない 21
  22. 22. ライブラリのインストール ■ composer でサクサクと 22 "require": { ... (略) ... "idimensionz/sendgrid-webapi-v3": "dev-patchUpdateProfile", "tomwalder/php-gds": "v2.1.0", "zendframework/zend-db": "^2.8", "zendframework/zend-inputfilter": "^2.7", "zendframework/zend-form": "^2.9" }, composer.json 抜粋
  23. 23. SendGrid設定1 ■ config/autoload/sendgrid.local.php 23 'sendgrid' => [ 'api_key' => 'SG.M2ae3...(略)...P6Pu7VlD2Yf28', 'mail_param' => [ 'from' => 'info@tilde.coffee', 'subject'=> '[Tilde.Coffee]お問い合わせありがとうございます', 'text' => '', ], ],
  24. 24. SendGrid設定2 ■ config/autoload/sendgrid.global.php 24 'dependencies' => [ 'factories' => [ AppMailSendGrid::class => AppMailSendGridFactory::class, ], ],
  25. 25. SendGrid API実行処理1 ■ src/APP/Mail/SendGrid.php 25 class SendGrid extends SendGridApiEndpointAbstract { public function __construct( SendGridRequest $sendGridRequest, $mail_param ) { parent::__construct($sendGridRequest, self::ENDPOINT); $this->mail_param = $mail_param; } // 次ページへ続く
  26. 26. SendGrid API実行処理2 ■ src/APP/Mail/SendGrid.php 26 // 前ページの続き public function sendByTemplate($mailto, $body) { $this->mail_param['to'] = $mailto; $this->mail_param['text'] = $body; return $this->post('', $this->mail_param); } } 送信API実行
  27. 27. SendGrid API実行処理Factory ■ src/APP/Mail/SendGridFactory.php 27 class SendGridFactory{ public function __invoke(ContainerInterface $container) { $config = $container->get('config'); $authenticationOptionSetter = new AuthenticationOptionSetter(); $authentication = new AuthenticationApiKey( $authenticationOptionSetter, $config['sendgrid']['api_key'] ); $sendgridRequest = new SendGridRequest( $authentication, self::SENDGRID_API_HOST); return new SendGrid($sendgridRequest, $config['sendgrid']['mail_param']); 認証設定 実行処理 インスタンス生成
  28. 28. SendGrid注意点 ■ HTMLメールがデフォルト プレーンテキストで送りたい場合 [Settings] -> [Mail Settings] -> [Plain Content] を ON 28
  29. 29. SendGrid注意点 ■ 本文のリンクがトラッキングURLに変換されてしまう。 プレーンテキストの場合は、リンクをそのまま出力したい [Settings] -> [Tracking] -> [Click Tracking] 29
  30. 30. SendGrid注意点 ■ 1回のAPIリクエストで宛先数は最大10,000まで指定可能 ■ 1秒あたり3,000リクエストを超えないことを推奨 30
  31. 31. 参考文献 ■ PSR-7 : http://www.php-fig.org/psr/psr-7/ ■ PSR-7 By Example : https://mwop.net/blog/2015-01-26-psr-7-by-example.html ■ Master Zend Framework : http://www.masterzendframework.com/zend-expressive-introduction/ ■ PHP The Right Way : http://www.phptherightway.com/ 31
  32. 32. まとめ ■ GAE/PHP には誰も興味が無い ■ いまどきのPHP: PSR-7 & Middleware ■ GAE/PHP は、PSR-7 & Middleware で 32

×