ulvis.paste.net

Paste Search Dynamic
Recent pastes
memcached.php
  1. <?php
  2.  
  3. /**
  4. * Items to show on each page.
  5. */
  6. define('ITEMS_PER_PAGE', 25);
  7.  
  8. /**
  9. * Build a URL. You can pass multiple parameters to this function to preserve GET keys/values.
  10. *
  11. * @return string
  12. */
  13. function buildUrl() {
  14.                 $preservedArgs = func_get_args();
  15.                 $url = $_SERVER['PHP_SELF'];
  16.                 $args = array_intersect_key($_GET, array_flip($preservedArgs));
  17.                 return htmlspecialchars($url . '?' . (!empty($args) ? http_build_query($args) : ''), ENT_QUOTES, 'UTF-8');
  18. }
  19.  
  20. /**
  21. * Transforms a dimension in bytes to a human readable string.
  22. *
  23. * @param int $size
  24. * @return string
  25. */
  26. function toHumanReadable($size) {
  27.                 static $sizes = 'BKMGTP';
  28.                 $factor = floor((strlen($size) - 1) / 3);
  29.                 return sprintf('%.2f', $size / pow(1024, $factor)) . @$sizes[$factor];
  30. }
  31.  
  32. /**
  33. * Returns an array in a printable table.
  34. *
  35. * @param array $data
  36. * @return string
  37. */
  38. function toTextTable(array $data) {
  39.                 $maxLen = function($carry, $item) {
  40.                                 return max($carry, strlen($item));
  41.                 };
  42.                 $columns = array();
  43.                 $maxLenghts = array();
  44.                 foreach ($data as $id => $row) {
  45.                                 $columns = array_merge($columns, array_keys($row));
  46.                                 $maxLenghts[$id] = array_reduce($row, $maxLen, strlen($id));
  47.                 }
  48.                 $columns = array_unique($columns);
  49.                 $maxCol = array_reduce($columns, $maxLen, 0);
  50.  
  51.                 $separator = '+' . str_repeat('-', $maxCol + 2) . '+';
  52.                 $header = '|' . str_repeat(' ', $maxCol + 2) . '|';
  53.                 foreach (array_keys($data) as $id) {
  54.                                 $separator .= str_repeat('-', $maxLenghts[$id] + 2) . '+';
  55.                                 $header .= ' ' . str_pad($id, $maxLenghts[$id], ' ', STR_PAD_BOTH) . ' |';
  56.                 }
  57.  
  58.                 $res = $separator . PHP_EOL . $header . PHP_EOL . $separator . PHP_EOL;
  59.                 foreach ($columns as $col) {
  60.                                 $res .= '| ' . str_pad(strtoupper($col), $maxCol, ' ', STR_PAD_LEFT) . ' |';
  61.                                 foreach ($data as $id => $row) {
  62.                                                 $res .= ' ' . str_pad(@$row[$col], $maxLenghts[$id]) . ' |';
  63.                                 }
  64.                                 $res .= PHP_EOL;
  65.                 }
  66.                 return $res . $separator;
  67. }
  68.  
  69. $mem = new Memcached();
  70. $mem->addServer('127.0.0.1', 11211);
  71.  
  72. $_method = isset($_POST['_method']) ? $_POST['_method'] : $_SERVER['REQUEST_METHOD'];
  73. switch ($_method) {
  74.                 case 'GET':
  75.                                 if (isset($_GET['stats'])) {
  76.                                                 //header('Content-Type: text/plain');
  77.                                                 echo '<div style="font-family: monospace; white-space: pre-wrap;" class="text-center">'.toTextTable($mem->getStats()).'</div>';
  78.                                                 exit;
  79.                                 }
  80.                                 if (!empty($_GET['key'])) {
  81.                                                 header('Content-Type: text/plain');
  82.                                                 $value = $mem->get($_GET['key']);
  83.                                                 if ($mem->getResultCode() == Memcached::RES_NOTFOUND) {
  84.                                                                 header($_SERVER['SERVER_PROTOCOL'] . ' 404 Not Found');
  85.                                                                 echo 'NOT FOUND!';
  86.                                                 } elseif (is_string($value) || is_numeric($value)) {
  87.                                                                 echo $value;
  88.                                                 } elseif (is_null($value) || is_bool($value)) {
  89.                                                                 var_dump($value);
  90.                                                 } else {
  91.                                                                 print_r($value);
  92.                                                 }
  93.                                                 exit;
  94.                                 }
  95.                                 break;
  96.                 case 'DELETE':
  97.                                 if (isset($_POST['key'])) {
  98.                                                 $mem->delete($_POST['key']);
  99.                                 } else {
  100.                                                 $mem->flush();
  101.                                                 $mem->getMulti($mem->getAllKeys());
  102.                                 }
  103.                                 break;
  104.                 case 'POST':
  105.                                 if (!empty($_POST['key'])) {
  106.                                                 $mem->set($_POST['key'], @$_POST['value']);
  107.                                 }
  108.                                 break;
  109. }
  110.  
  111. $keys = $mem->getAllKeys() ?: array();
  112. if (!empty($_GET['q'])) {
  113.                 $q = $_GET['q'];
  114.                 $keys = array_filter($keys, function ($key) use ($q) {
  115.                                 return (strpos($key, $q) !== false);
  116.                 });
  117. }
  118.  
  119. $count = count($keys);
  120. $pages = max(1, ceil($count / ITEMS_PER_PAGE));
  121.  
  122. $page = (isset($_GET['page']) && is_numeric($_GET['page'])) ? (int) $_GET['page'] : 1;
  123. $page = max(1, min($page, $pages));
  124. sort($keys);
  125. $keys = array_slice($keys, ($page - 1) * ITEMS_PER_PAGE, ITEMS_PER_PAGE);
  126.  
  127. $items = $mem->getMulti($keys) ?: array();
  128.  
  129. $paginator = array();
  130. $diff = 2 + max(0, 3 - $page, $page - $pages + 2);
  131. for ($p = max(1, $page - $diff); $p <= min($pages, $page + $diff); $p++) {
  132.                 array_push($paginator, $p);
  133. }
  134.  
  135. $stats = $mem->getStats() ?: array();
  136. $overview = array();
  137. array_walk_recursive($stats, function($item, $key) use (&$overview) {
  138.                 $overview[$key] = isset($overview[$key]) ?  $item + $overview[$key] : $item;
  139. });
  140.  
  141. ?>
  142. <!DOCTYPE html>
  143. <html lang="en">
  144. <head>
  145.                 <title>Basic Memcached PHP interface</title>
  146.  
  147.                 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
  148.                 <script type="text/javascript">
  149.                                 var openPopup = function(url, title) {
  150.                                                                 $('#modal').on('shown.bs.modal', function(e) {
  151.                                                                         if (title) $('.modal-header h4', e.target).html(title);
  152.                                                                         $.get(url, function(data) {
  153.                                                                                 $('.modal-body', e.target).html(data);
  154.                                                                         });
  155.                                                                 }).modal('show');
  156.                                                 },
  157.                                                 deletionConfirm = function(evt) {
  158.                                                                 if (!window.confirm('Are you sure you wish to proceed?')) {
  159.                                                                                 evt.preventDefault();
  160.                                                                 }
  161.                                                 },
  162.                                                 pageRefresh = function() {
  163.                                                                 window.location = window.location.href;
  164.                                                 };
  165.                 </script>
  166. </head>
  167.  
  168. <body>
  169. <div class="container" style="width: 940px;">
  170.                 <h1>Basic Memcached PHP interface</h1>
  171.  
  172.                 <div class="panel panel-default">
  173.                                 <div class="panel-heading">
  174.                                                 <h2 class="panel-title">Stored keys <span class="label label-primary"><?= $count ?></span></h2>
  175.                                 </div>
  176.  
  177.                                 <div class="panel-body">
  178.                                                 <div class="row">
  179.                                                                 <div class="col-lg-8">
  180.                                                                                 <form method="GET" action="<?= buildUrl() ?>">
  181.                                                                                                 <div class="input-group">
  182.                                                                                                                 <input type="search" name="q" class="form-control" placeholder="Search&hellip;" value="<?= @$_GET['q'] ?>" />
  183.                                                                                                                 <span class="input-group-btn">
  184.                                                                                                                                 <button type="submit" class="btn btn-default" aria-label="Search">
  185.                                                                                                                                                 <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
  186.                                                                                                                                 </button>
  187.                                                                                                                 </span>
  188.                                                                                                 </div>
  189.                                                                                 </form>
  190.                                                                 </div>
  191.                                                                 <div class="col-md-4">
  192.                                                                                 <form class="form-inline" method="POST" action="<?= buildUrl() ?>">
  193.                                                                                                 <input type="hidden" name="_method" value="DELETE" />
  194.                                                                                                 <div class="btn-group btn-group-justified" role="group">
  195.                                                                                                                 <div class="btn-group" role="group"><button type="button" class="btn btl-lg btn-default" onclick="pageRefresh()">Refresh</button></div>
  196.                                                                                                                 <div class="btn-group" role="group"><button type="submit" class="btn btn-danger">Flush</button></div>
  197.                                                                                                 </div>
  198.                                                                                 </form>
  199.                                                                 </div>
  200.                                                 </div>
  201.                                 </div>
  202.                                 <div class="table-responsive small">
  203.                                                 <table class="table table-bordered table-hover table-striped">
  204.                                                                 <thead>
  205.                                                                                 <tr>
  206.                                                                                                 <th class="col-md-5">Key</th>
  207.                                                                                                 <th class="col-md-5">Value</th>
  208.                                                                                                 <th class="col-md-2">Actions</th>
  209.                                                                                 </tr>
  210.                                                                 </thead>
  211.                                                                 <tbody>
  212.                                                                 <?php foreach ($items as $key => $value): ?>
  213.                                                                                 <tr<?php if ($_method == 'POST' && @$_POST['key'] == $key): ?> class="success"<?php endif; ?>>
  214.                                                                                                 <td><?= $key ?></td>
  215.                                                                                                 <td>
  216.                                                                                                                 <?php
  217.                                                                                                                 if (is_string($value) || is_numeric($value)):
  218.                                                                                                                                 echo (strlen((string) $value) >= 512) ? substr($value, 0, 512) . '&hellip;' : $value;
  219.                                                                                                                 elseif (is_null($value) || is_bool($value)):
  220.                                                                                                                                 echo '<b>';
  221.                                                                                                                                 var_dump($value);
  222.                                                                                                                                 echo '</b>';
  223.                                                                                                                 else:
  224.                                                                                                                                 echo '<i>' . (is_array($value) ? '(Array)' : '(Object)') . '</i>';
  225.                                                                                                                 endif;
  226.                                                                                                                 ?>
  227.                                                                                                 </td>
  228.                                                                                                 <td>
  229.                                                                                                                 <form class="form-inline" method="POST" action="<?= buildUrl('q', 'page') ?>">
  230.                                                                                                                                 <input type="hidden" name="key" value="<?= $key ?>" />
  231.                                                                                                                                 <input type="hidden" name="_method" value="DELETE" />
  232.                                                                                                                                 <div class="text-nowrap" role="group">
  233.                                                                                                                                                 <button type="button" class="btn btn-default btn-sm" onclick="openPopup('<?= buildUrl() ?>key=<?= $key ?>')">View Raw</button>
  234.                                                                                                                                                 <button type="submit" class="btn btn-danger btn-sm">Delete</button>
  235.                                                                                                                                 </div>
  236.                                                                                                                 </form>
  237.                                                                                                 </td>
  238.                                                                                 </tr>
  239.                                                                 <?php endforeach; ?>
  240.                                                                 </tbody>
  241.                                                 </table>
  242.                                 </div>
  243.                                 <div class="panel-footer">
  244.  
  245.                                                 <div class="row">
  246.                                                                 <div class="col-md-4">
  247.                                                                                 <?php if ($pages > 1): ?>
  248.                                                                                 <nav>
  249.                                                                                                 <ul class="pagination">
  250.                                                                                                                 <li<?php if ($page == 1): ?> class="disabled"<?php endif; ?>>
  251.                                                                                                                                 <a href="<?= buildUrl('q') ?>&amp;page=1" aria-label="First"><span aria-hidden="true">&laquo;</span></a>
  252.                                                                                                                 </li>
  253.                                                                                                                 <?php foreach ($paginator as $p): ?>
  254.                                                                                                                 <li<?php if ($p == $page): ?> class="active"<?php endif; ?>>
  255.                                                                                                                                 <a href="<?= buildUrl('q') ?>&amp;page=<?= $p ?>"><?= $p ?></a>
  256.                                                                                                                 </li>
  257.                                                                                                                 <?php endforeach; ?>
  258.                                                                                                                 <li<?php if ($page == $pages): ?> class="disabled"<?php endif; ?>>
  259.                                                                                                                                 <a href="<?= buildUrl('q') ?>&amp;page=<?= $pages ?>" aria-label="Last"><span aria-hidden="true">&raquo;</span></a>
  260.                                                                                                                 </li>
  261.                                                                                                 </ul>
  262.                                                                                 </nav>
  263.                                                                                 <?php endif; ?>
  264.                                                                 </div>
  265.                                                                 <div class="col-md-8">
  266.                                                                                 <form class="form-inline" method="POST" action="<?= buildUrl('q', 'page') ?>">
  267.                                                                                                 <div class="form-group">
  268.                                                                                                                 <label for="key">Key</label>
  269.                                                                                                                 <input type="text" class="form-control" id="key" name="key" placeholder="key" required />
  270.                                                                                                 </div>
  271.                                                                                                 <div class="form-group">
  272.                                                                                                                 <label for="value">Value</label>
  273.                                                                                                                 <input type="text" class="form-control" id="value" name="value" placeholder="value" required />
  274.                                                                                                 </div>
  275.                                                                                                 <button type="submit" class="btn btn-primary">Store</button>
  276.                                                                                 </form>
  277.                                                                 </div>
  278.                                                 </div>
  279.                                 </div>
  280.                 </div>
  281.  
  282.                 <div class="panel panel-primary">
  283.                                 <div class="panel-heading">
  284.                                                 <h2 class="panel-title">Server statistics</h2>
  285.                                 </div>
  286.                                 <table class="table table-bordered table-hover table-striped">
  287.                                                 <thead>
  288.                                                                 <tr>
  289.                                                                                 <th class="col-md-4">Server</th>
  290.                                                                                 <th class="col-md-8">Usage</th>
  291.                                                                 </tr>
  292.                                                 </thead>
  293.                                                 <tbody>
  294.                                                                 <?php foreach ($stats as $server => $data): ?>
  295.                                                                 <?php $data['bytes_ratio'] = $data['bytes'] / $data['limit_maxbytes']; $perc = sprintf('%01.1f%%', 100 * $data['bytes_ratio']); ?>
  296.                                                                 <tr>
  297.                                                                                 <td><?= $server ?></td>
  298.                                                                                 <td>
  299.                                                                                                 <div class="progress">
  300.                                                                                                                 <div
  301.                                                                                                                                 class="progress-bar progress-bar-<?= ($data['bytes_ratio'] > .9) ? 'danger' : ($data['bytes_ratio'] > .75 ? 'warning' : 'success') ?>"
  302.                                                                                                                                 role="progressbar" aria-valuenow="<?= $data['bytes'] ?>" aria-valuemin="0" aria-valuemax="<?= $data['limit_maxbytes'] ?>" style="min-width: 2em; width: <?= $perc ?>"
  303.                                                                                                                                 data-toggle="tooltip" data-placement="top" title="<?= toHumanReadable($data['bytes']) . ' / ' . toHumanReadable($data['limit_maxbytes']) ?>"
  304.                                                                                                                 >
  305.                                                                                                                                 <?= $perc ?>
  306.                                                                                                                 </div>
  307.                                                                                                 </div>
  308.                                                                                 </td>
  309.                                                                 </tr>
  310.                                                                 <?php endforeach; ?>
  311.                                                 </tbody>
  312.                                                 <?php if (count($stats) > 1): ?>
  313.                                                 <tfoot>
  314.                                                                 <?php $overview['bytes_ratio'] = $overview['bytes'] / $overview['limit_maxbytes']; $perc = sprintf('%01.1f%%', 100 * $overview['bytes_ratio']); ?>
  315.                                                                 <tr>
  316.                                                                                 <td>Overall</td>
  317.                                                                                 <td>
  318.                                                                                                 <div class="progress">
  319.                                                                                                                 <div
  320.                                                                                                                                 class="progress-bar progress-bar-<?= ($overview['bytes_ratio'] > .9) ? 'danger' : ($overview['bytes_ratio'] > .75 ? 'warning' : 'success') ?>"
  321.                                                                                                                                 role="progressbar" aria-valuenow="<?= $overview['bytes'] ?>" aria-valuemin="0" aria-valuemax="<?= $overview['limit_maxbytes'] ?>" style="min-width: 2em; width: <?= $perc ?>"
  322.                                                                                                                                 data-toggle="tooltip" data-placement="top" title="<?= toHumanReadable($overview['bytes']) . ' / ' . toHumanReadable($overview['limit_maxbytes']) ?>"
  323.                                                                                                                 >
  324.                                                                                                                                 <?= $perc ?>
  325.                                                                                                                 </div>
  326.                                                                                                 </div>
  327.                                                                                 </td>
  328.                                                                 </tr>
  329.                                                 </tfoot>
  330.                                                 <?php endif; ?>
  331.                                 </table>
  332.                                 <div class="panel-footer">
  333.                                                 <button type="button" class="btn btn-default btn-block btn-primary" onclick="openPopup('<?= buildUrl() ?>stats', 'Detailed Stats')">View Detailed Stats</button>
  334.                                 </div>
  335.                 </div>
  336.  
  337.                 <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
  338.                 <script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
  339.                 <script type="text/javascript">
  340.                                 (function() {
  341.                                                 var elements = document.querySelectorAll('.btn-danger');
  342.                                                 for (var i = 0; i < elements.length; i++) {
  343.                                                                 elements[i].addEventListener('click', deletionConfirm);
  344.                                                 }
  345.  
  346.                                                 $('[data-toggle="tooltip"]').tooltip();
  347.                                 })();
  348.                 </script>
  349.  
  350.                 <div id="modal" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="Modal" aria-hidden="true">
  351.                                 <div class="modal-dialog">
  352.                                                 <div class="modal-content">
  353.                                                                 <div class="modal-header">
  354.                                                                                 <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
  355.                                                                                 <h4 class="modal-title" id="myModalLabel">&nbsp;</h4>
  356.                                                                 </div>
  357.                                                                 <div class="modal-body"></div>
  358.                                                 </div>
  359.                                 </div>
  360.                 </div>
  361.  
  362. </body>
  363. </html>
  364.  
Parsed in 0.071 seconds