{"id":17223,"date":"2018-08-31T14:14:59","date_gmt":"2018-08-31T05:14:59","guid":{"rendered":"http:\/\/labs.gree.jp\/blog\/?p=17223"},"modified":"2018-09-03T12:31:20","modified_gmt":"2018-09-03T03:31:20","slug":"app-engine-php-7-2-standard-env-%e3%81%ab%e3%81%8a%e3%81%91%e3%82%8b-redis-memcached-spanner-%e3%81%ae%e5%88%a9%e7%94%a8%e6%96%b9%e6%b3%95","status":"publish","type":"post","link":"https:\/\/labs.gree.jp\/blog\/2018\/08\/17223\/","title":{"rendered":"App Engine PHP 7.2 Standard Env \u306b\u304a\u3051\u308b Redis \/ Memcached \/ Spanner \u306e\u5229\u7528\u65b9\u6cd5"},"content":{"rendered":"<p>\u30a4\u30f3\u30d5\u30e9\u306e\u77e2\u53e3\u3067\u3059<\/p>\n<p>GAE\u306b\u304a\u3044\u3066\u3064\u3044\u306bPHP 7\u306b\u5bfe\u5fdc\u3057\u305f\u30e9\u30f3\u30bf\u30a4\u30e0\u304c<a href=\"https:\/\/cloud.google.com\/appengine\/docs\/standard\/php7\/\">\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u307e\u3057\u305f<\/a>\uff01 gVisor\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u4eca\u307e\u3067\u3088\u308a\u3082\u5727\u5012\u7684\u306b\u5236\u7d04\u304c\u6e1b\u308a\u3001\u6a19\u6e96\u7684\u306a\u69cb\u6210\u3092\u52d5\u4f5c\u3055\u305b\u3084\u3059\u304f\u306a\u308a\u307e\u3057\u305f\u3002\u307e\u305f\u5927\u304d\u306a\u61f8\u5ff5\u70b9\u3067\u3042\u3063\u305f\u8a00\u8a9e\u51e6\u7406\u7cfb\u30e9\u30f3\u30bf\u30a4\u30e0\u306e\u66f4\u65b0\u983b\u5ea6\u306b\u3064\u3044\u3066\u3082\u6539\u5584\u3055\u308c\u308b\u3053\u3068\u304c\u30a2\u30ca\u30a6\u30f3\u30b9\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3055\u3066\u3001\u305d\u306e\u3088\u3046\u306aGAE PHP 7\u3067\u3059\u304c\u3001DB\u3084\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u307e\u308f\u308a\u306b\u3064\u3044\u3066\u306f\u3069\u3046\u306a\u3063\u3066\u3044\u308b\u306e\u3067\u3057\u3087\u3046\u304b\u3002\u901a\u4fe1\u5468\u308a\u3082\u81ea\u7531\u306b\u306a\u3063\u305f\u305f\u3081\u4efb\u610f\u306e\u30d7\u30ed\u30c8\u30b3\u30eb\u3067\u5916\u90e8\u306b\u63a5\u7d9a\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u308a\u4f7f\u7528\u3067\u304d\u308b\u3082\u306e\u306f\u304b\u306a\u308a\u5897\u3048\u3066\u3044\u308b\u306f\u305a\u3067\u3059\u3002<\/p>\n<p>\u3057\u304b\u3057\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u8a18\u8f09\u3055\u308c\u3066\u3044\u308bDB\u306f<a href=\"https:\/\/cloud.google.com\/appengine\/docs\/standard\/php7\/storage-options\">Datastore, Cloud SQL\u306b\u3068\u3069\u307e\u3063\u3066\u3044\u307e\u3059<\/a>\u3002\u307e\u305fApp Engine\u4ed8\u5c5e\u306e\u30de\u30cd\u30fc\u30b8\u30c9Memcache\u306f\u63d0\u4f9b\u3055\u308c\u307e\u305b\u3093\u3002<\/p>\n<p>App Engine\u304b\u3089\u3088\u304f\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u60f3\u5b9a\u3055\u308c\u308b3\u3064\u306e\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306b\u3064\u3044\u3066\u52d5\u4f5c\u3055\u305b\u308b\u624b\u6bb5\u3092\u691c\u8a3c\u3057\u307e\u3057\u305f\u3002<\/p>\n<h2>Public Network\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3<\/h2>\n<p>Redis \/ Memcached\u3092\u5229\u7528\u3059\u308b\u969b\u3082\u3063\u3068\u3082\u554f\u984c\u306b\u306a\u308b\u3053\u3068\u306f\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3067\u3059\u3002Standard Environment\u3067\u306fPrivate Network\u304c\u5229\u7528\u3067\u304d\u306a\u3044\u305f\u3081\u3001Redis \/ Memcached\u3092Public Network\u306b\u516c\u958b\u3057\u3064\u3064\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3092\u78ba\u4fdd\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002<\/p>\n<p>Heroku \/ Redis Labs \/ MemCachier \u306a\u3069\u3044\u304f\u3064\u304b\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u8abf\u67fb\u3057\u305f\u3068\u3053\u308d\u3002\u6697\u53f7\u5316\u306f\u5b9f\u65bd\u305b\u305a\u30d1\u30b9\u30ef\u30fc\u30c9\u8a8d\u8a3c\u3060\u3051\u3092\u8ffd\u52a0\u3057\u305f\u4e0a\u3067\u3001\u76d7\u8074\u306e\u30ea\u30b9\u30af\u306e\u5c11\u306a\u3044\u540c\u4e00\u30af\u30e9\u30a6\u30c9\u306e\u540c\u4e00\u30ea\u30fc\u30b8\u30e7\u30f3\u306b\u8a2d\u7f6e\u3059\u308b\u65b9\u6cd5\u304c\u4e00\u822c\u7684\u306a\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>SSL\u306f\u5bfe\u5fdc\u3059\u308b\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u304c\u5c11\u306a\u304fApp Engine\u304b\u3089\u306e\u30a2\u30af\u30bb\u30b9\u3067\u306fSSL\u30c8\u30f3\u30cd\u30eb\u306e\u8a2d\u7f6e\u3082\u96e3\u3057\u3044\u3053\u3068\u3084\u4f4e\u30ec\u30a4\u30c6\u30f3\u30b7\u304c\u6c42\u3081\u3089\u308c\u308b\u30ad\u30e3\u30c3\u30b7\u30e5\u306b\u304a\u3044\u3066\u30ec\u30a4\u30c6\u30f3\u30b7\u304c\u5897\u52a0\u3057\u3066\u3057\u307e\u3046\u3068\u3044\u3063\u305f\u554f\u984c\u304b\u3089\u3042\u307e\u308a\u63a8\u5968\u3055\u308c\u3066\u3044\u306a\u3044\u30b5\u30fc\u30d3\u30b9\u304c\u591a\u3044\u3088\u3046\u3067\u3057\u305f\u3002<\/p>\n<h2>Redis<\/h2>\n<p>\u516c\u5f0f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u306fRedis Labs\u304c\u63a8\u5968\u3055\u308c\u3066\u3044\u307e\u3059\u3002Cloud Memorystore\u304cPublic network\u304b\u3089\u5229\u7528\u3067\u304d\u306a\u3044\u5236\u7d04\u304c\u3042\u308b\u305f\u3081\u3067\u3057\u3087\u3046\u3002<\/p>\n<p>\u3053\u3053\u3067\u306f\u7c21\u5358\u306b\u691c\u8a3c\u3059\u308b\u305f\u3081Compute Engine\u306bRedis\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3001conf\u3067\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u8a2d\u5b9a\u3057\u307e\u3059<\/p>\n<p>redis.conf<\/p>\n<pre class=\"toolbar:2 lang:default decode:true\" title=\"redis.conf\">requirepass XXXXXXXX<\/pre>\n<p>Public network\u304b\u3089\u30a2\u30af\u30bb\u30b9\u3067\u304d\u308b\u3088\u3046firewall\u3092\u8a2d\u5b9a\u3057\u3066\u758e\u901a\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<p>predis\u3067\u306f\u306a\u304fphpredis\u3092\u5229\u7528\u3059\u308b\u5834\u5408\u306b\u306fredis.so\u306f<a href=\"https:\/\/cloud.google.com\/appengine\/docs\/standard\/php7\/runtime#dynamically_loadable_extensions\">Dynamically loadable extensions<\/a>\u306b\u306a\u3063\u3066\u3044\u308b\u305f\u3081php.ini\u306b\u8ffd\u52a0\u3057\u307e\u3059<\/p>\n<p>\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5229\u7528\u3059\u308b\u4ee5\u5916\u306f\u901a\u5e38\u3068\u540c\u3058\u3088\u3046\u306b\u5229\u7528\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\n\nrequire __DIR__ . '\/vendor\/autoload.php';\n\n$redis = new Redis();\n$redis-&gt;connect('XX.XX.XX.XX', 6379);\n$redis-&gt;auth('XXXXXXXX');\n\nvar_dump($redis-&gt;set('foo', 'bar'));\nvar_dump($redis-&gt;get('foo'));<\/pre>\n<h2>Memcached<\/h2>\n<p>Memcached\u30b5\u30fc\u30d0\u30fc\u3092\u69cb\u7bc9\u3057\u3001SASL\u3092\u8a2d\u5b9a\u3057\u307e\u3059\u3002SASL\u306f\u524d\u8ff0\u306eRedis password\u306a\u3069\u3068\u6bd4\u8f03\u3057\u3066\u3060\u3044\u3076\u8907\u96d1\u3067\u3059\u3002\u3053\u306e\u3042\u305f\u308a\u304c\u53c2\u8003\u306b\u306a\u308a\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-secure-memcached-on-ubuntu-16-04\">https:\/\/www.digitalocean.com\/community\/tutorials\/how-to-install-and-secure-memcached-on-ubuntu-16-04<\/a><\/p>\n<p>Redis\u3068\u540c\u69d8firewall\u3092\u89e3\u653e\u3057\u307e\u3059\u3002<\/p>\n<p>php.ini\u306bmemcached.so\u3092\u8ffd\u52a0\u3057\u3066\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u3068\u554f\u984c\u306a\u304f\u63a5\u7d9a\u3067\u304d\u307e\u3057\u305f\u3002<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\n\nrequire __DIR__ . '\/vendor\/autoload.php';\n\n$mc = new Memcached();\n$mc-&gt;setOption(Memcached::OPT_BINARY_PROTOCOL, true);\n$mc-&gt;addServer(\"XX.XX.XX.XX\", 11211);\n$mc-&gt;setSaslAuthData(\"USER\", \"PASSWORD\");\n\nvar_dump($mc-&gt;set('foo', 'bar'));\nvar_dump($mc-&gt;get('foo'));<\/pre>\n<h2>Spanner<\/h2>\n<p>\u7d50\u8ad6\u304b\u3089\u3044\u3044\u307e\u3059\u3068Spanner\u306e\u5229\u7528\u306f\u3046\u307e\u304f\u884c\u3063\u3066\u3044\u307e\u305b\u3093\u3002\u758e\u901a\u306f\u3067\u304d\u308b\u306e\u3067\u3059\u304c\u63a5\u7d9a\u30671\u79d2\u3061\u304b\u304f\u304b\u304b\u3063\u3066\u3057\u307e\u3046\u72b6\u6cc1\u3067\u3059\u3002<\/p>\n<p>\u307e\u305a\u3001\u540c\u4e00\u30ea\u30fc\u30b8\u30e7\u30f3\u306bSpanner\u306edatabase\u3092\u4f5c\u6210\u3057\u307e\u3059\u3002<\/p>\n<p>php.ini\u306bprotobuf.so\u3068grpc.so\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/GoogleCloudPlatform\/google-cloud-php-spanner\/blob\/master\/README.md#session-warmup\">README<\/a>\u306b\u3042\u308b\u3088\u3046\u306b\u5404\u7a2e\u30ad\u30e3\u30c3\u30b7\u30e5\u3092\u5229\u7528\u3059\u308b\u3088\u3046\u306b\u3057\u306a\u304c\u3089\u63a5\u7d9a\u3059\u308b\u30b3\u30fc\u30c9\u3092\u66f8\u304d\u307e\u3059<\/p>\n<pre class=\"lang:php decode:true\">&lt;?php\n\nrequire __DIR__ . '\/vendor\/autoload.php';\n\nuse Google\\Cloud\\Spanner\\SpannerClient;\nuse Google\\Cloud\\Spanner\\Session\\CacheSessionPool;\nuse Symfony\\Component\\Cache\\Adapter\\FilesystemAdapter;\n\n$cache = new FilesystemAdapter(); \/\/ Semaphore extension\u306f\u975e\u5bfe\u5fdc\u306e\u305f\u3081\/tmp\u306b\u30ad\u30e3\u30c3\u30b7\u30e5\n$sessionPool = new CacheSessionPool($cache);\n$projectId = getenv('GOOGLE_CLOUD_PROJECT');\n$spanner = new SpannerClient([\n    'projectId' =&gt; $projectId,\n    'authCache' =&gt; $cache,\n]);\n$database = $spanner-&gt;connect(\n    'INSTANCE',\n    'DATABASE',\n    [\n        'sessionPool' =&gt; $sessionPool\n    ]\n);\n\n$results = $database-&gt;execute('SELECT \"Hello Spanner World\" as test');\nforeach ($results as $row) {\n    print($row['test'] . PHP_EOL);\n}\n\n$database-&gt;close();<\/pre>\n<p>\u6e96\u5099\u3068\u3057\u3066\u306f\u3053\u308c\u3067\u3044\u3044\u306f\u305a\u306a\u306e\u3067\u3059\u304c\u3001\u5b9f\u969b\u306b\u306f\u73fe\u5b9f\u7684\u3067\u306f\u306a\u3044\u30ec\u30b9\u30dd\u30f3\u30b9\u30bf\u30a4\u30e0\u3068\u306a\u3063\u3066\u3057\u307e\u3044\u307e\u3059<\/p>\n<pre class=\"lang:default decode:true \">$ ab -n 10 -c 1 https:\/\/XXXX.appspot.com\/spanner.php\nRequests per second:    0.81 [#\/sec] (mean)\nTime per request:       1234.942 [ms] (mean)<\/pre>\n<p>\u30bb\u30de\u30d5\u30a9 extension\u304c\u4f7f\u3048\u306a\u3044\u4ef6\u3068\u3001Spanner\u3078\u306e\u63a5\u7d9a\u304c\u9045\u3044\u554f\u984c\u306b\u3064\u3044\u3066\u306f\u305d\u308c\u305e\u308cissue\u3092\u8d77\u7968\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p><a href=\"https:\/\/github.com\/GoogleCloudPlatform\/google-cloud-php\/issues\/1255\">https:\/\/github.com\/GoogleCloudPlatform\/google-cloud-php\/issues\/1255<\/a><\/p>\n<p><a href=\"https:\/\/issuetracker.google.com\/issues\/113305563\">https:\/\/issuetracker.google.com\/issues\/113305563<\/a><\/p>\n<h2>\u307e\u3068\u3081<\/h2>\n<p>GAE PHP 7.2\u306f\u975e\u5e38\u306b\u30e2\u30c0\u30f3\u3067\u5feb\u9069\u306a\u30b5\u30fc\u30d3\u30b9\u3068\u306a\u3063\u3066\u3044\u307e\u3057\u305f\u3002\u307e\u305f\u30df\u30c9\u30eb\u30a6\u30a7\u30a2\u306b\u3064\u3044\u3066\u3082Public Network\u304c\u5fc5\u9808\u3068\u306a\u3063\u3066\u3057\u307e\u3046\u3082\u306e\u306e\u4ee5\u524d\u3088\u308a\u3082\u81ea\u7531\u306b\u5229\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u4e00\u65b9\u3067PHP\u306b\u9650\u3089\u305a\u3067\u3059\u304c\u4ee5\u524d\u304b\u3089\u8ab2\u984c\u3067\u3042\u3063\u305fGAE\u304b\u3089\u306eSpanner\u5229\u7528\u306b\u3064\u3044\u3066\u306f\u524d\u9032\u306f\u3042\u308b\u3082\u306e\u306e\u4f9d\u7136\u3068\u3057\u3066\u96e3\u3057\u3044\u3088\u3046\u3067\u3059\u3002<\/p>\n<p>\u307e\u305f\u305d\u306e\u30e1\u30f3\u30c6\u30ca\u30f3\u30b9\u30d5\u30ea\u30fc\u306e\u6027\u8cea\u304b\u3089Memcached\u3084Redis\u306b\u3064\u3044\u3066\u3082\u30de\u30cd\u30fc\u30b8\u30c9\u30b5\u30fc\u30d3\u30b9\u304c\u63d0\u4f9b\u3055\u308c\u308b\u3068\u306a\u304a\u826f\u3044\u306e\u3067\u3059\u304c\u3001GCP\u3067\u306f\u306a\u304f\u4ed6\u793e\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u304c\u73fe\u5728\u306e\u843d\u3068\u3057\u6240\u304b\u3082\u3057\u308c\u307e\u305b\u3093<\/p>\n<p>\u30a4\u30f3\u30d5\u30e9\u306b\u95a2\u3059\u308b\u69cb\u7bc9\u30b3\u30b9\u30c8\u3092\u5287\u7684\u306b\u524a\u6e1b\u3067\u304d\u308b\u3001GAE\u306e\u5236\u7d04\u304c\u3055\u3089\u306b\u6e1b\u308a\u30e2\u30c0\u30f3\u306b\u306a\u3063\u305f\u3053\u3068\u306f\u5927\u5909\u559c\u3070\u3057\u3044\u3053\u3068\u3067\u3059\u3002\u3055\u3089\u306b\u3044\u308d\u3044\u308d\u306a\u30e6\u30fc\u30b9\u30b1\u30fc\u30b9\u3078\u306e\u5bfe\u5fdc\u3084\u30b5\u30fc\u30d3\u30b9\u9023\u643a\u6027\u306e\u5411\u4e0a\u304c\u3059\u3059\u3080\u3068\u3044\u3044\u3067\u3059\u306d\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u30a4\u30f3\u30d5\u30e9\u306e\u77e2\u53e3\u3067\u3059 GAE\u306b\u304a\u3044\u3066\u3064\u3044\u306bPHP 7\u306b\u5bfe\u5fdc\u3057\u305f\u30e9\u30f3\u30bf\u30a4\u30e0\u304c\u30ea\u30ea\u30fc\u30b9\u3055\u308c\u307e\u3057\u305f\uff01 gVisor\u3092\u5229\u7528\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u4eca\u307e\u3067\u3088\u308a\u3082\u5727\u5012\u7684\u306b\u5236\u7d04\u304c\u6e1b\u308a\u3001\u6a19\u6e96\u7684\u306a\u69cb\u6210\u3092\u52d5\u4f5c\u3055\u305b\u3084\u3059\u304f\u306a\u308a\u307e\u3057\u305f\u3002\u307e\u305f\u5927\u304d\u306a\u61f8\u5ff5\u70b9\u3067\u3042\u3063 [&hellip;]<\/p>\n","protected":false},"author":128,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[],"tags":[8],"class_list":["post-17223","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-php"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/17223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/users\/128"}],"replies":[{"embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/comments?post=17223"}],"version-history":[{"count":3,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/17223\/revisions"}],"predecessor-version":[{"id":17232,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/posts\/17223\/revisions\/17232"}],"wp:attachment":[{"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/media?parent=17223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/categories?post=17223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/labs.gree.jp\/blog\/wp-json\/wp\/v2\/tags?post=17223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}