Frederic G. MARAND 8 лет назад
Родитель
Сommit
99f4c722c0

+ 11 - 0
Memcache_UI/Core/Config.inc

@@ -31,6 +31,13 @@ namespace Memcache_UI\Core {
       'localhost:11211',
     );
 
+    /**
+     * The PDO DSN for the history database. Typically a SQLite path.
+     *
+     * @var string
+     */
+    public $dsn = NULL;
+
     public function __construct(Context $context) {
       $path = $context->getDirectory() . '/memcache_ui.local.php';
       if (file_exists($path)) {
@@ -48,6 +55,10 @@ namespace Memcache_UI\Core {
           elseif (empty($this->servers)) {
             $context->setMessage(Context::t('Empty servers array: no server info.'), LOG_ERR);
           }
+
+          if (empty($this->dsn)) {
+            $context->setMessage(Context::t('No DSN in config: history features not enabled.', LOG_NOTICE));
+          }
         }
         else {
           $context->setMessage(Context::t('Local config @path exists but is not readable', array(

+ 15 - 0
Memcache_UI/Core/Context.inc

@@ -10,6 +10,13 @@ namespace Memcache_UI\Core {
      */
     protected $base;
 
+    /**
+     * Database PDO handle.
+     *
+     * @var resource
+     */
+    protected $dbh = NULL;
+
     /**
      * Base directory for the script, for file operations
      */
@@ -69,6 +76,7 @@ namespace Memcache_UI\Core {
     function __construct() {
       $this->initLocale(); // Check extension and initialize locale
       $this->getTidy(); // Needed to check optional extension
+      $this->initDB();
     }
 
     function __destruct() {
@@ -208,6 +216,13 @@ namespace Memcache_UI\Core {
       return $this->tidy;
     }
 
+    protected function initDB() {
+      if (empty($this->dbh)) {
+        return;
+      }
+
+    }
+
     /**
      * Initialize the locale based on the user Accept-Language header.
      *

+ 19 - 0
Memcache_UI/Core/Database.php

@@ -0,0 +1,19 @@
+<?php
+namespace Memcache_UI\Core {
+  class Database {
+    public $handle;
+
+    public static function createSchema() {
+
+    }
+
+    public function __construct(Context $context) {
+      try {
+        $h = new PDO($dsn);
+      }
+      catch (PDOException $e) {
+        echo 'Connection failed: ' . $e->getMessage();
+      }
+    }
+  }
+}

BIN
doc/main-logo-sb.png


+ 70 - 0
doc/main.css

@@ -0,0 +1,70 @@
+@CHARSET "UTF-8";
+
+body {
+  margin: 0.5em;
+}
+
+#footer,
+#header {
+  background-color: #204060;
+  color: white;
+  height: 5em; 
+  margin: 0;
+  padding: 1em
+}
+
+#footer li {
+  display: inline;
+  list-style-type: none;
+}
+
+#footer-logos {
+  text-align: center;
+}
+
+#footer-logos a img {
+  opacity: 0.25;
+  -o-transition: opacity 0.2s ease-in-out;
+  transition: opacity 0.2s ease-in-out;
+}
+
+#footer-logos a:hover img,
+#footer-logos a:focus img {
+  opacity: 0.75;
+}
+
+#main {
+  background-color: #e0f0ff;
+  margin: 0;
+  padding: 1em;
+}
+
+#nav {
+  float: right;
+  padding: 2em 0 0 0;
+}
+
+#nav li {
+  float: left;
+  margin: 0;
+  padding: 0 0 0 0.5em;
+  list-style-type: none;
+}
+
+#nav li a {
+  border-radius: 0.5em;
+  color: #ccc;
+  color: rgba(255, 255, 255, 0.7);
+  font-weight: bold;
+  padding: 0.5em;
+  text-decoration: none;
+  text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.5);
+  -o-transition: all 0.3s ease-in-out;
+  transition: all 0.3s ease-in-out;
+}
+
+#nav li a:hover,
+#nav li a:focus {
+  background-color: rgba(255, 255, 255, 0.15);
+  color: #fff;
+}

+ 25 - 0
doc/main.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html>
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">    
+    <title>Insert title here</title>
+    <link rel="stylesheet" type="text/css" href="main.css" />
+    </head>
+  <body>
+    <div id="header">
+      <ul id="nav">
+        <li><a href="#">Dashboard</a></li>
+        <li><a href="#">Logs</a></li>
+        <li><a href="#">Settings</a></li>
+        </ul>
+      </div>
+    <div id="main">
+      <p>Main</p>
+      </div>
+    <div id="footer">
+      <ul id="footer-logos">
+        <li><a href="#"><img src="main-logo-sb.png" /></a></li>
+        </ul>
+      </div>
+    </body>
+  </html>

BIN
doc/memcache_ui.sq3


+ 4 - 0
doc/memcache_ui.sql

@@ -0,0 +1,4 @@
+BEGIN TRANSACTION;
+CREATE TABLE events (category TEXT, id INTEGER PRIMARY KEY, ts NUMERIC, value NUMERIC);
+CREATE UNIQUE INDEX pk_id ON events(id ASC);
+COMMIT;

+ 186 - 0
doc/memcached-tool.pl

@@ -0,0 +1,186 @@
+#!/usr/bin/perl
+#
+# memcached-tool:
+#   stats/management tool for memcached.
+#
+# Author:
+#   Brad Fitzpatrick <brad@danga.com>
+#
+# License:
+#   public domain.  I give up all rights to this
+#   tool.  modify and copy at will.
+#
+
+use strict;
+use IO::Socket::INET;
+
+my $host = shift;
+my $mode = shift || "display";
+my ($from, $to);
+
+if ($mode eq "display") {
+    undef $mode if @ARGV;
+} elsif ($mode eq "move") {
+    $from = shift;
+    $to = shift;
+    undef $mode if $from < 6 || $from > 17;
+    undef $mode if $to   < 6 || $to   > 17;
+    print STDERR "ERROR: parameters out of range\n\n" unless $mode;
+} elsif ($mode eq 'dump') {
+    ;
+} elsif ($mode eq 'stats') {
+    ;
+} else {
+    undef $mode;
+}
+
+undef $mode if @ARGV;
+
+die 
+"Usage: memcached-tool <host[:port]> [mode]\n
+       memcached-tool 10.0.0.5:11211 display    # shows slabs
+       memcached-tool 10.0.0.5:11211            # same.  (default is display)
+       memcached-tool 10.0.0.5:11211 stats      # shows general stats
+       memcached-tool 10.0.0.5:11211 move 7 9   # takes 1MB slab from class #7
+                                                # to class #9.
+
+You can only move slabs around once memory is totally allocated, and only
+once the target class is full.  (So you can't move from #6 to #9 and #7
+to #9 at the same itme, since you'd have to wait for #9 to fill from
+the first reassigned page)
+" unless $host && $mode;
+
+$host .= ":11211" unless $host =~ /:\d+/;
+
+my $sock = IO::Socket::INET->new(PeerAddr => $host,
+				 Proto    => 'tcp');
+die "Couldn't connect to $host\n" unless $sock;
+
+
+if ($mode eq "move") {
+    my $tries = 0;
+    while (1) {
+	print $sock "slabs reassign $from $to\r\n";
+	my $res = <$sock>;
+	$res =~ s/\s+//;
+	if ($res eq "DONE") {
+	    print "Success.\n";
+	    exit 0;
+	} elsif ($res eq "CANT") {
+	    print "Error: can't move from $from to $to.  Destination not yet full?  See usage docs.\n";
+	    exit;
+	} elsif ($res eq "BUSY") {
+	    if (++$tries == 3) {
+		print "Failed to move after 3 tries.  Try again later.\n";
+		exit;
+	    }
+
+	    print "Page busy, retrying...\n";
+	    sleep 1;
+	}
+    }
+
+    exit;
+}
+
+if ($mode eq 'dump') {
+    my %items;
+    my $totalitems;
+
+    print $sock "stats items\r\n";
+
+    while (<$sock>) {
+        last if /^END/;
+        if (/^STAT items:(\d*):number (\d*)/) {
+            $items{$1} = $2;
+            $totalitems += $2;
+        }
+    }
+    print STDERR "Dumping memcache contents\n";
+    print STDERR "  Number of buckets: " . scalar(keys(%items)) . "\n";
+    print STDERR "  Number of items  : $totalitems\n";
+
+    foreach my $bucket (sort(keys(%items))) {
+        print STDERR "Dumping bucket $bucket - " . $items{$bucket} . " total items\n";
+        print $sock "stats cachedump $bucket $items{$bucket} 1\r\n";
+        my %keyexp;
+        while (<$sock>) {
+            last if /^END/;
+            # return format looks like this
+            # ITEM foo [6 b; 1176415152 s]
+            if (/^ITEM (\S+) \[.* (\d+) s\]/) {
+                $keyexp{$1} = $2;
+            }
+        }
+
+        foreach my $k (keys(%keyexp)) {
+            my $val;
+            print $sock "get $k\r\n";
+            my $response = <$sock>;
+            $response =~ /VALUE (\S+) (\d+) (\d+)/;
+            my $flags = $2;
+            my $len = $3;
+            read $sock, $val , $len;
+            # get the END
+            $_ = <$sock>;
+            $_ = <$sock>;
+            print "add $k $flags $keyexp{$k} $len\r\n$val\r\n";
+        }
+    }
+    exit;
+}
+
+if ($mode eq 'stats') {
+    my %items;
+
+    print $sock "stats\r\n";
+
+    while (<$sock>) {
+        last if /^END/;
+        chomp;
+        if (/^STAT\s+(\S*)\s+(.*)/) {
+            $items{$1} = $2;
+        }
+    }
+    printf ("#%-17s %5s %11s\n", $host, "Field", "Value");
+    foreach my $name (sort(keys(%items))) {
+      printf ("%24s %12s\n", $name, $items{$name});
+      
+    }
+    exit;
+}
+
+# display mode:
+
+my %items;  # class -> { number, age, chunk_size, chunks_per_page,
+            #            total_pages, total_chunks, used_chunks,
+            #            free_chunks, free_chunks_end }
+
+print $sock "stats items\r\n";
+while (<$sock>) {
+    last if /^END/;
+    if (/^STAT items:(\d+):(\w+) (\d+)/) {
+	$items{$1}{$2} = $3;
+    }
+}
+
+print $sock "stats slabs\r\n";
+while (<$sock>) {
+    last if /^END/;
+    if (/^STAT (\d+):(\w+) (\d+)/) {
+	$items{$1}{$2} = $3;
+    }
+}
+
+print "  #  Item_Size   Max_age  1MB_pages Count   Full?\n";
+foreach my $n (1..40) {
+    my $it = $items{$n};
+    next if (0 == $it->{total_pages});
+    my $size = $it->{chunk_size} < 1024 ? "$it->{chunk_size} B " : 
+	sprintf("%.1f kB", $it->{chunk_size} / 1024.0);
+    my $full = $it->{free_chunks_end} == 0 ? "yes" : " no";
+    printf "%3d   %8s %7d s %7d %7d %7s\n",
+                        $n, $size, $it->{age}, $it->{total_pages},
+                        $it->{number}, $full;
+}
+

+ 6 - 4
memcache.php

@@ -32,14 +32,16 @@ if (is_readable($local)) {
 }
 
 if (!defined('ADMIN_USERNAME')) {
-  define('ADMIN_USERNAME', 'memcache');
+  define('ADMIN_USERNAME', 'apc');
 }
 if (!defined('ADMIN_PASSWORD')) {
-  define('ADMIN_PASSWORD', 'password');
+  define('ADMIN_PASSWORD', 'apc');
 }
 if (empty($MEMCACHE_SERVERS)) {
-  $MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
-  $MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
+  $MEMCACHE_SERVERS[] = 'localhost:11211'; // add more as an array
+  $MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
+  //$MEMCACHE_SERVERS[] = 'mymemcache-server1:11211'; // add more as an array
+  //$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
 }
 
 ////////// END OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////////

+ 8 - 3
memcache_ui.local.php

@@ -10,9 +10,14 @@
  * - $this->password
  * - $this->servers
  */
-
-$this->account = '';
-$this->password = '';
+/*
+$this->account = 'apc';
+$this->password = 'apc';
 $this->servers = array(
   'localhost:11211',
 );
+*/
+$dsn = 'sqlite:/var/lib/memcache_ui.sq3';
+$dsn = 'sqlite:memcache_ui.sq3';
+$db = new PDO($dsn);
+var_dump($db);

+ 0 - 0
memcache_ui.sq3