appengine/flexible/memcache/app.php (88 lines of code) (raw):

<?php /** * Copyright 2016 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ use DI\Container; use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Slim\Factory\AppFactory; use Slim\Views\Twig; // Create the container AppFactory::setContainer($container = new Container()); $container->set('view', function () { return Twig::create(__DIR__); }); // Create App $app = AppFactory::create(); // Display errors $app->addErrorMiddleware(true, true, true); $container->set('memcached', function () { # [START gae_flex_redislabs_memcache] $endpoint = getenv('MEMCACHE_ENDPOINT'); $username = getenv('MEMCACHE_USERNAME'); $password = getenv('MEMCACHE_PASSWORD'); $memcached = new Memcached; if ($username && $password) { $memcached->setOption(Memcached::OPT_BINARY_PROTOCOL, true); $memcached->setSaslAuthData($username, $password); } list($host, $port) = explode(':', $endpoint); if (!$memcached->addServer($host, $port)) { throw new Exception("Failed to add server $host:$port"); } # [END gae_flex_redislabs_memcache] return $memcached; }); $app->get('/vars', function (Request $request, Response $response) { $vars = [ 'MEMCACHE_PORT_11211_TCP_ADDR', 'MEMCACHE_PORT_11211_TCP_PORT' ]; $lines = array(); foreach ($vars as $var) { $val = getenv($var); array_push($lines, "$var = $val"); } $response->getBody()->write(implode("\n", $lines)); return $response->withHeader('Content-Type', 'text/plain'); }); $app->get('/', function (Request $request, Response $response) use ($container) { $memcached = $container->get('memcached'); return $container->get('view')->render($response, 'memcache.html.twig', [ 'who' => $memcached->get('who'), 'count' => $memcached->get('count'), 'host' => $request->getUri()->getHost(), ]); }); $app->post('/reset', function (Request $request, Response $response) use ($container) { $memcached = $container->get('memcached'); $memcached->delete('who'); $memcached->set('count', 0); return $container->get('view')->render($response, 'memcache.html.twig', [ 'host' => $request->getUri()->getHost(), 'count' => 0, 'who' => '', ]); }); $app->post('/', function (Request $request, Response $response) use ($container) { parse_str((string) $request->getBody(), $postData); $who = $postData['who'] ?? ''; $memcached = $container->get('memcached'); $memcached->set('who', $who); $count = $memcached->increment('count'); if (false === $count) { // Potential race condition. Use binary protocol to avoid. $memcached->set('count', 0); $count = 0; } return $container->get('view')->render($response, 'memcache.html.twig', [ 'who' => $who, 'count' => $count, 'host' => $request->getUri()->getHost(), ]); }); $app->get('/memcached/{key}', function (Request $request, Response $response, $args) use ($container) { $memcached = $container->get('memcached'); $value = $memcached->get($args['key']); $response->getBody()->write((string) $value); return $response; }); $app->put('/memcached/{key}', function (Request $request, Response $response, $args) use ($container) { $memcached = $container->get('memcached'); $value = (string) $request->getBody(); $success = $memcached->set($args['key'], $value, time() + 600); // 10 minutes expiration $response->getBody()->write((string) $success); return $response; }); return $app;