source: spip-zone/_plugins_/xray/trunk/xray_apc.php @ 107419

Last change on this file since 107419 was 107419, checked in by jluc@…, 3 years ago

tidy up

File size: 49.0 KB
Line 
1<?php
2/*
3+----------------------------------------------------------------------+
4| APC                                                                  |
5+----------------------------------------------------------------------+
6| Copyright (c) 2006-2011 The PHP Group                                |
7+----------------------------------------------------------------------+
8| This source file is subject to version 3.01 of the PHP license,      |
9| that is bundled with this package in the file LICENSE, and is        |
10| available through the world-wide-web at the following url:           |
11| http://www.php.net/license/3_01.txt                                  |
12| If you did not receive a copy of the PHP license and are unable to   |
13| obtain it through the world-wide-web, please send a note to          |
14| license@php.net so we can mail you a copy immediately.               |
15+----------------------------------------------------------------------+
16| Authors: Ralf Becker <beckerr@php.net>                               |
17|          Rasmus Lerdorf <rasmus@php.net>                             |
18|          Ilia Alshanetsky <ilia@prohost.org>                         |
19|          JLuc http://contrib.spip.net/JLuc                           |
20+----------------------------------------------------------------------+
21
22All other licensing and usage conditions are those of the PHP Group.
23
24*/
25
26if (!autoriser('webmestre'))
27        die("Autorisation non accordée : devenez webmestre d'abord.");
28
29$VERSION = '$Id$';
30
31////////// READ OPTIONAL CONFIGURATION FILE ////////////
32if (file_exists("apc.conf.php"))
33        include("apc.conf.php");
34////////////////////////////////////////////////////////
35
36////////// BEGIN OF DEFAULT CONFIG AREA ///////////////////////////////////////////////////////////
37
38defaults('USE_AUTHENTICATION', 0); // Use (internal) authentication - best choice if
39// no other authentication is available
40// If set to 0:
41//  There will be no further authentication. You
42//  will have to handle this by yourself!
43// If set to 1:
44//  You need to change ADMIN_PASSWORD to make
45//  this work!
46defaults('ADMIN_USERNAME', 'admin'); // Admin Username
47defaults('ADMIN_PASSWORD', 'password'); // Admin Password - CHANGE THIS TO ENABLE!!!
48
49// (beckerr) I'm using a clear text password here, because I've no good idea how to let
50//           users generate a md5 or crypt password in a easy way to fill it in above
51
52// defaults('DATE_FORMAT', "d.m.Y H:i:s");      // German
53defaults('DATE_FORMAT', 'Y/m/d H:i:s'); // US
54
55defaults('GRAPH_SIZE', 400); // Image size
56
57//defaults('PROXY', 'tcp://127.0.0.1:8080');
58
59// _CACHE_NAMESPACE est défini par memoization et préfixe chaque nom de cache SPIP
60// On ne souhaite pas que cette partie du nom s'affiche sur chaque ligne
61define('XRAY_NEPASAFFICHER_DEBUTNOMCACHE', _CACHE_NAMESPACE);
62
63////////// END OF DEFAULT CONFIG AREA /////////////////////////////////////////////////////////////
64
65// Strings utils
66
67function is_serialized($str)
68{
69        return ($str == serialize(false) || @unserialize($str) !== false);
70}
71function get_serial_class($serial)
72{
73        $types = array(
74                's' => 'string',
75                'a' => 'array',
76                'b' => 'bool',
77                'i' => 'int',
78                'd' => 'float',
79                'N;' => 'NULL'
80        );
81       
82        $parts = explode(':', $serial, 4);
83        return isset($types[$parts[0]]) ? $types[$parts[0]] : trim($parts[2], '"');
84}
85function spipsafe_unserialize($str)
86{
87        if (strpos($str, "SPIPTextWheelRuleset") !== false) {
88                if (isset($_GET['ZOOM']) and ($_GET['ZOOM'] == 'TEXTECOURT'))
89                        return "Début : " . substr(trim($str), 0, 80) . '...';
90                else
91                        return "Brut : $str";
92        }
93        $unser = unserialize($str);
94        if (is_array($unser) and isset($unser['texte']) and isset($_GET['ZOOM']) and ($_GET['ZOOM'] == 'TEXTECOURT')) {
95                $unser['texte'] = trim(preg_replace('/\s+/', ' ', $unser['texte']));
96                if (mb_strlen($unser['texte']) > 80)
97                        $unser['texte'] = mb_substr($unser['texte'], 0, 80) . '...';
98                elseif (!$unser['texte'])
99                        $unser['texte'] = '(vide)';
100        }
101        return "Unserialized : " . print_r($unser, 1);
102}
103function print_contexte($extra, $tostring)
104{
105        $print = print_r($extra, 1);
106        if (stripos($print, 'Array') === 0) {
107                $print = trim(substr($print, 5), " (\n\r\t");
108                $print = preg_replace_callback("/\[id_([a-z\-_]+)\]\s*=>\s*(\d+)$/im", function($match)
109                {
110                        return $match[0] . '</xmp>' . bouton_objet($match[1], $match[2]) . '<xmp>';
111                }, $print);
112        }
113        if ($tostring)
114                return $print;
115        echo $print;
116}
117
118function bouton_objet($objet, $id_objet)
119{
120        $objet_visible = $objet;
121        if ($objet == 'secteur')
122                $objet = 'rubrique';
123        else
124                $objet = $objet;
125        return "<a href='/ecrire/?exec=$objet&id_$objet=$id_objet' target='blank'
126                        style='position:absolute; right:0px'
127                        title=" . attribut_html(generer_info_entite($id_objet, $objet, 'titre', 'etoile')) . ">[voir $objet_visible]</a>";
128}
129
130////////////////////////////////////////////////////////////////////////
131
132// "define if not defined"
133function defaults($d, $v)
134{
135        if (!defined($d))
136                define($d, $v); // or just @define(...)
137}
138
139// rewrite $PHP_SELF to block XSS attacks
140//
141$PHP_SELF = isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'], ''), ENT_QUOTES, 'UTF-8') : '';
142$time     = time();
143$host     = php_uname('n');
144if ($host) {
145        $host = '(' . $host . ')';
146}
147if (isset($_SERVER['SERVER_ADDR'])) {
148        $host .= ' (' . $_SERVER['SERVER_ADDR'] . ')';
149}
150
151// operation constants
152define('OB_HOST_STATS', 1);
153define('OB_USER_CACHE', 2);
154define('OB_VERSION_CHECK', 3);
155
156// check validity of input variables
157$vardom = array(
158        'exec' => '/^[a-zA-Z_\-0-9]+$/', // pour #URL_ECRIRE{xray}
159        'OB' => '/^\d+$/', // operational mode switch
160        'CC' => '/^[01]$/', // clear cache requested
161        'DU' => '/^.*$/', // Delete User Key
162        'SH' => '/^[a-z0-9]*$/', // shared object description
163       
164        'IMG' => '/^[123]$/', // image to generate
165        'LO' => '/^1$/', // login requested
166       
167        'COUNT' => '/^\d+$/', // number of line displayed in list
168        'SCOPE' => '/^[AD]$/', // list view scope
169        'S_KEY' => '/^[AHSMCDTZ]$/', // first sort key
170        'SORT' => '/^[DA]$/', // second sort key
171        'AGGR' => '/^\d+$/', // aggregation by dir level
172        'SEARCH' => '~^[a-zA-Z0-9/_.\-\$\^]*$~', // aggregation by dir level
173        'TYPECACHE' => '/^(|ALL|SESSIONS|SESSIONS_AUTH|SESSIONS_NONAUTH|FORMULAIRES)$/', //
174        'ZOOM' => '/^(|TEXTECOURT|TEXTELONG)$/', //
175        'EXTRA' => '/^(|CONTEXTE|CONTEXTES_SPECIAUX|INFO_AUTEUR|INVALIDEURS|INVALIDEURS_SPECIAUX)$/' //
176);
177
178// cache scope
179$scope_list = array(
180        'A' => 'cache_list',
181        'D' => 'deleted_list'
182);
183
184global $MYREQUEST; // fix apcu
185// handle POST and GET requests
186if (empty($_REQUEST)) {
187        if (!empty($_GET) && !empty($_POST)) {
188                $_REQUEST = array_merge($_GET, $_POST);
189        } else if (!empty($_GET)) {
190                $_REQUEST = $_GET;
191        } else if (!empty($_POST)) {
192                $_REQUEST = $_POST;
193        } else {
194                $_REQUEST = array();
195        }
196}
197
198// check parameter syntax
199foreach ($vardom as $var => $dom) {
200        if (!isset($_REQUEST[$var]))
201                $MYREQUEST[$var] = NULL;
202        else if (!is_array($_REQUEST[$var]) && preg_match($dom . 'D', $_REQUEST[$var]))
203                $MYREQUEST[$var] = $_REQUEST[$var];
204        else {
205                echo "<xmp>ERREUR avec parametre d'url « $var » qui vaut « {$_REQUEST[$var]} »</xmp>";
206                $MYREQUEST[$var] = $_REQUEST[$var] = NULL;
207        }
208}
209
210// check parameter sematics
211if (empty($MYREQUEST['SCOPE']))
212        $MYREQUEST['SCOPE'] = "A";
213if (empty($MYREQUEST['S_KEY']))
214        $MYREQUEST['S_KEY'] = "H";
215if (empty($MYREQUEST['SORT']))
216        $MYREQUEST['SORT'] = "D";
217if (empty($MYREQUEST['OB']))
218        $MYREQUEST['OB'] = OB_HOST_STATS;
219if (!isset($MYREQUEST['COUNT']))
220        $MYREQUEST['COUNT'] = 20;
221if (!isset($scope_list[$MYREQUEST['SCOPE']]))
222        $MYREQUEST['SCOPE'] = 'A';
223
224global $MY_SELF; // fix apcu
225global $MY_SELF_WO_SORT; // fix apcu
226$MY_SELF_WO_SORT = "$PHP_SELF" . "?SCOPE=" . $MYREQUEST['SCOPE'] . "&COUNT=" . $MYREQUEST['COUNT'] . "&SEARCH=" . $MYREQUEST['SEARCH'] . "&TYPECACHE=" . $MYREQUEST['TYPECACHE'] . "&ZOOM=" . $MYREQUEST['ZOOM'] . "&EXTRA=" . $MYREQUEST['EXTRA'] . "&exec=" . $MYREQUEST['exec'] . "&OB=" . $MYREQUEST['OB'];
227$MY_SELF         = $MY_SELF_WO_SORT . "&S_KEY=" . $MYREQUEST['S_KEY'] . "&SORT=" . $MYREQUEST['SORT'];
228$self            = "http" . (!empty($_SERVER['HTTPS']) ? "s" : "") . "://" . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
229
230global $IMG_BASE;
231$IMG_BASE = "$PHP_SELF" . "?exec=" . $MYREQUEST['exec'];
232
233// authentication needed?
234//
235if (!USE_AUTHENTICATION) {
236        $AUTHENTICATED = 1;
237} else {
238        $AUTHENTICATED = 0;
239        if (ADMIN_PASSWORD != 'password' && ($MYREQUEST['LO'] == 1 || isset($_SERVER['PHP_AUTH_USER']))) {
240               
241                if (!isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) || $_SERVER['PHP_AUTH_USER'] != ADMIN_USERNAME || $_SERVER['PHP_AUTH_PW'] != ADMIN_PASSWORD) {
242                        Header("WWW-Authenticate: Basic realm=\"APC Login\"");
243                        Header("HTTP/1.0 401 Unauthorized");
244                       
245                        echo <<<EOB
246                                <html><body>
247                                <h1>Rejected!</h1>
248                                <big>Wrong Username or Password!</big><br/>&nbsp;<br/>&nbsp;
249                                <big><a href='$PHP_SELF?OB={$MYREQUEST['OB']}'>Continue...</a></big>
250                                </body></html>
251EOB;
252                        exit;
253                       
254                } else {
255                        $AUTHENTICATED = 1;
256                }
257        }
258}
259
260// clear cache
261if ($AUTHENTICATED && isset($MYREQUEST['CC']) && $MYREQUEST['CC']) {
262        apcu_clear_cache();
263}
264
265if ($AUTHENTICATED && !empty($MYREQUEST['DU'])) {
266        apcu_delete($MYREQUEST['DU']);
267}
268
269if (!function_exists('apcu_cache_info')) {
270        echo "No cache info available.  APC does not appear to be running.";
271        exit;
272}
273
274$cache = apcu_cache_info();
275
276$mem = apcu_sma_info();
277
278// don't cache this page
279//
280header("Cache-Control: no-store, no-cache, must-revalidate"); // HTTP/1.1
281header("Cache-Control: post-check=0, pre-check=0", false);
282header("Pragma: no-cache"); // HTTP/1.0
283
284function duration($ts)
285{
286        global $time;
287        $years = (int) ((($time - $ts) / (7 * 86400)) / 52.177457);
288        $rem   = (int) (($time - $ts) - ($years * 52.177457 * 7 * 86400));
289        $weeks = (int) (($rem) / (7 * 86400));
290        $days  = (int) (($rem) / 86400) - $weeks * 7;
291        $hours = (int) (($rem) / 3600) - $days * 24 - $weeks * 7 * 24;
292        $mins  = (int) (($rem) / 60) - $hours * 60 - $days * 24 * 60 - $weeks * 7 * 24 * 60;
293        $str   = '';
294        if ($years == 1)
295                $str .= "$years year, ";
296        if ($years > 1)
297                $str .= "$years years, ";
298        if ($weeks == 1)
299                $str .= "$weeks week, ";
300        if ($weeks > 1)
301                $str .= "$weeks weeks, ";
302        if ($days == 1)
303                $str .= "$days day,";
304        if ($days > 1)
305                $str .= "$days days,";
306        if ($hours == 1)
307                $str .= " $hours hour and";
308        if ($hours > 1)
309                $str .= " $hours hours and";
310        if ($mins == 1)
311                $str .= " 1 minute";
312        else
313                $str .= " $mins minutes";
314        return $str;
315}
316
317// create graphics
318//
319function graphics_avail()
320{
321        return extension_loaded('gd');
322}
323if (isset($MYREQUEST['IMG'])) {
324        if (!graphics_avail()) {
325                exit(0);
326        }
327       
328        function fill_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $color2, $text = '', $placeindex = 0)
329        {
330                $r = $diameter / 2;
331                $w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
332               
333               
334                if (function_exists("imagefilledarc")) {
335                        // exists only if GD 2.0.1 is avaliable
336                        imagefilledarc($im, $centerX + 1, $centerY + 1, $diameter, $diameter, $start, $end, $color1, IMG_ARC_PIE);
337                        imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2, IMG_ARC_PIE);
338                        imagefilledarc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color1, IMG_ARC_NOFILL | IMG_ARC_EDGED);
339                } else {
340                        imagearc($im, $centerX, $centerY, $diameter, $diameter, $start, $end, $color2);
341                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
342                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($start + 1)) * $r, $centerY + sin(deg2rad($start)) * $r, $color2);
343                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end - 1)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
344                        imageline($im, $centerX, $centerY, $centerX + cos(deg2rad($end)) * $r, $centerY + sin(deg2rad($end)) * $r, $color2);
345                        imagefill($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $color2);
346                }
347                if ($text) {
348                        if ($placeindex > 0) {
349                                imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
350                                imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
351                               
352                        } else {
353                                imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
354                        }
355                }
356        }
357       
358        function text_arc($im, $centerX, $centerY, $diameter, $start, $end, $color1, $text, $placeindex = 0)
359        {
360                $r = $diameter / 2;
361                $w = deg2rad((360 + $start + ($end - $start) / 2) % 360);
362               
363                if ($placeindex > 0) {
364                        imageline($im, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $diameter, $placeindex * 12, $color1);
365                        imagestring($im, 4, $diameter, $placeindex * 12, $text, $color1);
366                       
367                } else {
368                        imagestring($im, 4, $centerX + $r * cos($w) / 2, $centerY + $r * sin($w) / 2, $text, $color1);
369                }
370        }
371       
372        function fill_box($im, $x, $y, $w, $h, $color1, $color2, $text = '', $placeindex = '')
373        {
374                global $col_black;
375                $x1 = $x + $w - 1;
376                $y1 = $y + $h - 1;
377               
378                imagerectangle($im, $x, $y1, $x1 + 1, $y + 1, $col_black);
379                if ($y1 > $y)
380                        imagefilledrectangle($im, $x, $y, $x1, $y1, $color2);
381                else
382                        imagefilledrectangle($im, $x, $y1, $x1, $y, $color2);
383                imagerectangle($im, $x, $y1, $x1, $y, $color1);
384                if ($text) {
385                        if ($placeindex > 0) {
386                               
387                                if ($placeindex < 16) {
388                                        $px = 5;
389                                        $py = $placeindex * 12 + 6;
390                                        imagefilledrectangle($im, $px + 90, $py + 3, $px + 90 - 4, $py - 3, $color2);
391                                        imageline($im, $x, $y + $h / 2, $px + 90, $py, $color2);
392                                        imagestring($im, 2, $px, $py - 6, $text, $color1);
393                                       
394                                } else {
395                                        if ($placeindex < 31) {
396                                                $px = $x + 40 * 2;
397                                                $py = ($placeindex - 15) * 12 + 6;
398                                        } else {
399                                                $px = $x + 40 * 2 + 100 * intval(($placeindex - 15) / 15);
400                                                $py = ($placeindex % 15) * 12 + 6;
401                                        }
402                                        imagefilledrectangle($im, $px, $py + 3, $px - 4, $py - 3, $color2);
403                                        imageline($im, $x + $w, $y + $h / 2, $px, $py, $color2);
404                                        imagestring($im, 2, $px + 2, $py - 6, $text, $color1);
405                                }
406                        } else {
407                                imagestring($im, 4, $x + 5, $y1 - 16, $text, $color1);
408                        }
409                }
410        }
411       
412       
413        $size = GRAPH_SIZE / 3; // image size
414        if ($MYREQUEST['IMG'] == 3)
415                $image = imagecreate(3 * $size + 200, 2 * $size + 150);
416        else
417                $image = imagecreate($size + 50, $size + 10);
418       
419        $col_white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
420        $col_red   = imagecolorallocate($image, 0xD0, 0x60, 0x30);
421        $col_green = imagecolorallocate($image, 0x60, 0xF0, 0x60);
422        $col_black = imagecolorallocate($image, 0, 0, 0);
423        imagecolortransparent($image, $col_white);
424       
425        switch ($MYREQUEST['IMG']) {
426               
427                case 1:
428                        $s    = $mem['num_seg'] * $mem['seg_size'];
429                        $a    = $mem['avail_mem'];
430                        $x    = $y = $size / 2;
431                        $fuzz = 0.000001;
432                       
433                        // This block of code creates the pie chart.  It is a lot more complex than you
434                        // would expect because we try to visualize any memory fragmentation as well.
435                        $angle_from       = 0;
436                        $string_placement = array();
437                        for ($i = 0; $i < $mem['num_seg']; $i++) {
438                                $ptr  = 0;
439                                $free = $mem['block_lists'][$i];
440                                uasort($free, 'block_sort');
441                                foreach ($free as $block) {
442                                        if ($block['offset'] != $ptr) { // Used block
443                                                $angle_to = $angle_from + ($block['offset'] - $ptr) / $s;
444                                                if (($angle_to + $fuzz) > 1)
445                                                        $angle_to = 1;
446                                                if (($angle_to * 360) - ($angle_from * 360) >= 1) {
447                                                        fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_red);
448                                                        if (($angle_to - $angle_from) > 0.05) {
449                                                                array_push($string_placement, array(
450                                                                        $angle_from,
451                                                                        $angle_to
452                                                                ));
453                                                        }
454                                                }
455                                                $angle_from = $angle_to;
456                                        }
457                                        $angle_to = $angle_from + ($block['size']) / $s;
458                                        if (($angle_to + $fuzz) > 1)
459                                                $angle_to = 1;
460                                        if (($angle_to * 360) - ($angle_from * 360) >= 1) {
461                                                fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_green);
462                                                if (($angle_to - $angle_from) > 0.05) {
463                                                        array_push($string_placement, array(
464                                                                $angle_from,
465                                                                $angle_to
466                                                        ));
467                                                }
468                                        }
469                                        $angle_from = $angle_to;
470                                        $ptr        = $block['offset'] + $block['size'];
471                                }
472                                if ($ptr < $mem['seg_size']) { // memory at the end
473                                        $angle_to = $angle_from + ($mem['seg_size'] - $ptr) / $s;
474                                        if (($angle_to + $fuzz) > 1)
475                                                $angle_to = 1;
476                                        fill_arc($image, $x, $y, $size, $angle_from * 360, $angle_to * 360, $col_black, $col_red);
477                                        if (($angle_to - $angle_from) > 0.05) {
478                                                array_push($string_placement, array(
479                                                        $angle_from,
480                                                        $angle_to
481                                                ));
482                                        }
483                                }
484                        }
485                        foreach ($string_placement as $angle) {
486                                text_arc($image, $x, $y, $size, $angle[0] * 360, $angle[1] * 360, $col_black, bsize($s * ($angle[1] - $angle[0])));
487                        }
488                        break;
489               
490                case 2:
491                        $s = $cache['num_hits'] + $cache['num_misses'];
492                        $a = $cache['num_hits'];
493                       
494                        fill_box($image, 30, $size, 50, $s ? (-$a * ($size - 21) / $s) : 0, $col_black, $col_green, sprintf("%.1f%%", $s ? $cache['num_hits'] * 100 / $s : 0));
495                        fill_box($image, 130, $size, 50, $s ? -max(4, ($s - $a) * ($size - 21) / $s) : 0, $col_black, $col_red, sprintf("%.1f%%", $s ? $cache['num_misses'] * 100 / $s : 0));
496                        break;
497               
498                case 3:
499                        $s = $mem['num_seg'] * $mem['seg_size'];
500                        $a = $mem['avail_mem'];
501                        $x = 130;
502                        $y = 1;
503                        $j = 1;
504                       
505                        // This block of code creates the bar chart.  It is a lot more complex than you
506                        // would expect because we try to visualize any memory fragmentation as well.
507                        for ($i = 0; $i < $mem['num_seg']; $i++) {
508                                $ptr  = 0;
509                                $free = $mem['block_lists'][$i];
510                                uasort($free, 'block_sort');
511                                foreach ($free as $block) {
512                                        if ($block['offset'] != $ptr) { // Used block
513                                                $h = (GRAPH_SIZE - 5) * ($block['offset'] - $ptr) / $s;
514                                                if ($h > 0) {
515                                                        $j++;
516                                                        if ($j < 75)
517                                                                fill_box($image, $x, $y, 50, $h, $col_black, $col_red, bsize($block['offset'] - $ptr), $j);
518                                                        else
519                                                                fill_box($image, $x, $y, 50, $h, $col_black, $col_red);
520                                                }
521                                                $y += $h;
522                                        }
523                                        $h = (GRAPH_SIZE - 5) * ($block['size']) / $s;
524                                        if ($h > 0) {
525                                                $j++;
526                                                if ($j < 75)
527                                                        fill_box($image, $x, $y, 50, $h, $col_black, $col_green, bsize($block['size']), $j);
528                                                else
529                                                        fill_box($image, $x, $y, 50, $h, $col_black, $col_green);
530                                        }
531                                        $y += $h;
532                                        $ptr = $block['offset'] + $block['size'];
533                                }
534                                if ($ptr < $mem['seg_size']) { // memory at the end
535                                        $h = (GRAPH_SIZE - 5) * ($mem['seg_size'] - $ptr) / $s;
536                                        if ($h > 0) {
537                                                fill_box($image, $x, $y, 50, $h, $col_black, $col_red, bsize($mem['seg_size'] - $ptr), $j++);
538                                        }
539                                }
540                        }
541                        break;
542               
543                case 4:
544                        $s = $cache['num_hits'] + $cache['num_misses'];
545                        $a = $cache['num_hits'];
546                       
547                        fill_box($image, 30, $size, 50, $s ? -$a * ($size - 21) / $s : 0, $col_black, $col_green, sprintf("%.1f%%", $s ? $cache['num_hits'] * 100 / $s : 0));
548                        fill_box($image, 130, $size, 50, $s ? -max(4, ($s - $a) * ($size - 21) / $s) : 0, $col_black, $col_red, sprintf("%.1f%%", $s ? $cache['num_misses'] * 100 / $s : 0));
549                        break;
550        }
551       
552        header("Content-type: image/png");
553        imagepng($image);
554        exit;
555}
556
557// pretty printer for byte values
558//
559function bsize($s)
560{
561        foreach (array(
562                '',
563                'K',
564                'M',
565                'G'
566        ) as $i => $k) {
567                if ($s < 1024)
568                        break;
569                $s /= 1024;
570        }
571        return sprintf("%5.1f %sBytes", $s, $k);
572}
573
574// sortable table header in "scripts for this host" view
575function sortheader($key, $name, $extra = '')
576{
577        global $MYREQUEST;
578        global $MY_SELF_WO_SORT; // fix apcu : il faut global ici aussi
579       
580        // fix apcu l'affichage des headers ne doit pas changer $MYREQUEST
581        $SORT = $MYREQUEST['SORT'];
582        if (!$SORT)
583                $SORT = 'D';
584        if ($MYREQUEST['S_KEY'] == $key)
585                $SORT = (($SORT == 'A') ? 'D' : 'A');
586        $url = "$MY_SELF_WO_SORT$extra&S_KEY=$key&SORT=$SORT";
587        return "<a class=sortable href='$url'>$name</a>";
588}
589
590// create menu entry
591function menu_entry($ob, $title)
592{
593        global $MYREQUEST;
594        global $MY_SELF; // fix apcu
595        if ($MYREQUEST['OB'] != $ob) {
596                return "<li><a href='" . parametre_url($MY_SELF, 'OB', $ob) . "'>$title</a></li>";
597        } else if (empty($MYREQUEST['SH'])) {
598                return "<li><span class=active>$title</span></li>";
599        } else {
600                return "<li><a class=\"child_active\" href='$MY_SELF'>$title</a></li>";
601        }
602}
603
604function put_login_link($s = "Login")
605{
606        global $MY_SELF, $MYREQUEST, $AUTHENTICATED;
607        // needs ADMIN_PASSWORD to be changed!
608        //
609        if (!USE_AUTHENTICATION) {
610                return;
611        } else if (ADMIN_PASSWORD == 'password') {
612                print <<<EOB
613                        <a href="#" onClick="javascript:alert('You need to set a password at the top of apc.php before this will work!');return false";>$s</a>
614EOB;
615        } else if ($AUTHENTICATED) {
616                print <<<EOB
617                        '{$_SERVER['PHP_AUTH_USER']}'&nbsp;logged&nbsp;in!
618EOB;
619        } else {
620                print <<<EOB
621                        <a href="$MY_SELF&LO=1">$s</a>
622EOB;
623        }
624}
625
626function block_sort($array1, $array2)
627{
628        if ($array1['offset'] > $array2['offset']) {
629                return 1;
630        } else {
631                return -1;
632        }
633}
634
635
636?>
637<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
638<html>
639<head><title>APCu INFO <?php
640echo $host;
641?></title>
642<style><!--
643body { background:white; font-size:100.01%; margin:0; padding:0; }
644body,p,td,th,input,submit { font-size:0.8em;font-family:arial,helvetica,sans-serif; }
645* html body   {font-size:0.8em}
646* html p      {font-size:0.8em}
647* html td     {font-size:0.8em}
648* html th     {font-size:0.8em}
649* html input  {font-size:0.8em}
650* html submit {font-size:0.8em}
651td { vertical-align:top }
652a { color:black; font-weight:none; text-decoration:none; }
653a:hover { text-decoration:underline; }
654div.content { padding:1em 1em 1em 1em; position:absolute; width:97%; z-index:100; }
655
656
657div.head div.login {
658        position:absolute;
659        right: 1em;
660        top: 1.2em;
661        color:white;
662        width:6em;
663        }
664div.head div.login a {
665        position:absolute;
666        right: 0em;
667        background:rgb(119,123,180);
668        border:solid rgb(102,102,153) 2px;
669        color:white;
670        font-weight:bold;
671        padding:0.1em 0.5em 0.1em 0.5em;
672        text-decoration:none;
673        }
674div.head div.login a:hover {
675        background:rgb(193,193,244);
676        }
677
678h1.apc { background:rgb(153,153,204); margin:0; padding:0.5em 1em 0.5em 1em; }
679* html h1.apc { margin-bottom:-7px; }
680h1.apc a:hover { text-decoration:none; color:rgb(90,90,90); }
681h1.apc div.logo {display: inline}
682h1.apc div.logo span.logo {
683        background:rgb(119,123,180);
684        color:black;
685        border-right: solid black 1px;
686        border-bottom: solid black 1px;
687        font-style:italic;
688        font-size:1em;
689        padding-left:1.2em;
690        padding-right:1.2em;
691        text-align:right;
692        }
693h1.apc div.logo span.name { color:white; font-size:0.7em; padding:0 0.8em 0 2em; }
694h1.apc div.nameinfo { color:white; display:inline; font-size:0.6em; margin-left: 1em; }
695h1.apc div.nameinfo a { color:white; margin-left: 3em; }
696h1.apc div.nameinfo img {margin-bottom: -10px; margin-right : 1em;}
697h1.apc div.copy { color:black; font-size:0.4em; position:absolute; right:1em; }
698hr.apc { display: none; }
699
700ol,menu { margin:1em 0 0 0; padding:0.2em; margin-left:1em;}
701ol.menu li { display:inline; margin-right:0.7em; list-style:none; font-size:85%}
702ol.menu a {
703        background:rgb(153,153,204);
704        border:solid rgb(102,102,153) 2px;
705        color:white;
706        font-weight:bold;
707        margin-right:0em;
708        padding:0.1em 0.5em 0.1em 0.5em;
709        text-decoration:none;
710        margin-left: 5px;
711        }
712ol.menu a.child_active {
713        background:rgb(153,153,204);
714        border:solid rgb(102,102,153) 2px;
715        color:white;
716        font-weight:bold;
717        margin-right:0em;
718        padding:0.1em 0.5em 0.1em 0.5em;
719        text-decoration:none;
720        border-left: solid black 5px;
721        margin-left: 0px;
722        }
723ol.menu span.active {
724        background:rgb(153,153,204);
725        border:solid rgb(102,102,153) 2px;
726        color:black;
727        font-weight:bold;
728        margin-right:0em;
729        padding:0.1em 0.5em 0.1em 0.5em;
730        text-decoration:none;
731        border-left: solid black 5px;
732        }
733ol.menu span.inactive {
734        background:rgb(193,193,244);
735        border:solid rgb(182,182,233) 2px;
736        color:white;
737        font-weight:bold;
738        margin-right:0em;
739        padding:0.1em 0.5em 0.1em 0.5em;
740        text-decoration:none;
741        margin-left: 5px;
742        }
743ol.menu a:hover {
744        background:rgb(193,193,244);
745        text-decoration:none;
746        }
747
748
749div.info {
750        background:rgb(204,204,204);
751        border:solid rgb(204,204,204) 1px;
752        margin-bottom:1em;
753        }
754div.info h2 {
755        background:rgb(204,204,204);
756        color:black;
757        font-size:1em;
758        margin:0;
759        padding:0.1em 1em 0.1em 1em;
760        }
761div.info table {
762        border:solid rgb(204,204,204) 1px;
763        border-spacing:0;
764        width:100%;
765        }
766div.info table th {
767        background:rgb(204,204,204);
768        color:white;
769        margin:0;
770        padding:0.1em 1em 0.1em 1em;
771        }
772div.info table th a.sortable { color:black; }
773div.info table tr.tr-0 { background:rgb(238,238,238); }
774div.info table tr.tr-1 { background:rgb(221,221,221); }
775div.info table td { padding:0.3em 1em 0.3em 1em; }
776div.info table td.td-0 { border-right:solid rgb(102,102,153) 1px; white-space:nowrap; }
777div.info table td.td-n { border-right:solid rgb(102,102,153) 1px; }
778div.info table td h3 {
779        color:black;
780        font-size:1.1em;
781        margin-left:-0.3em;
782        }
783
784div.graph { margin-bottom:1em }
785div.graph h2 { background:rgb(204,204,204);; color:black; font-size:1em; margin:0; padding:0.1em 1em 0.1em 1em; }
786div.graph table { border:solid rgb(204,204,204) 1px; color:black; font-weight:normal; width:100%; }
787div.graph table td.td-0 { background:rgb(238,238,238); }
788div.graph table td.td-1 { background:rgb(221,221,221); }
789div.graph table td { padding:0.2em 1em 0.4em 1em; }
790
791div.div1,div.div2 { margin-bottom:1em; width:35em; }
792div.div3 { position:absolute; left:40em; top:1em; width:580px; }
793//div.div3 { position:absolute; left:37em; top:1em; right:1em; }
794
795div.sorting { margin:1.5em 0em 1.5em 2em }
796.center { text-align:center }
797.aright { position:absolute;right:1em }
798.right { text-align:right }
799.ok { color:rgb(0,200,0); font-weight:bold}
800.failed { color:rgb(200,0,0); font-weight:bold}
801
802span.box {
803        border: black solid 1px;
804        border-right:solid black 2px;
805        border-bottom:solid black 2px;
806        padding:0 0.5em 0 0.5em;
807        margin-right:1em;
808}
809span.green { background:#60F060; padding:0 0.5em 0 0.5em}
810span.red { background:#D06030; padding:0 0.5em 0 0.5em }
811
812div.authneeded {
813        background:rgb(238,238,238);
814        border:solid rgb(204,204,204) 1px;
815        color:rgb(200,0,0);
816        font-size:1.2em;
817        font-weight:bold;
818        padding:2em;
819        text-align:center;
820        }
821
822input {
823        background:rgb(153,153,204);
824        border:solid rgb(102,102,153) 2px;
825        color:white;
826        font-weight:bold;
827        margin-right:1em;
828        padding:0.1em 0.5em 0.1em 0.5em;
829        }
830
831xmp { display: inline }
832
833//-->
834</style>
835</head>
836<body>
837<div class="head">
838        <h1 class="apc">
839                <div class="logo"><span class="logo"><a href="http://pecl.php.net/package/APCu">APCu</a></span></div>
840                <div class="nameinfo" style="display: inline">
841                        User Cache
842                        <a href='contrib.spip.net/4946'>
843                        <img src='data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAAEwAAABMBDsgnAwAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARiSURBVFiFxVdNSBtbFP5m8pqpRmw2EhAU/6JtQAStG5VEiC5cCkLBhcQuXIi2i0ppSZ+laGmxghJFwU1cZCe6cFFXKlYENybSQqMENa1SGLUEQ6iZ5CXfW/S9YEwm0YLtgUuY852f7557z5mJIAjCmSiKIgABPyXplyTS6a9rp4YLABLInxDxtyQRRQwMDKCioiItzpteDoeDiqKwpKQkHY74TSavra0lSb569UrNJjMBm83Guro6VVyj0fDt27fUarVp8cnJSX779o2SJKXF/8p0dgCg0+mwtLSEhoYGaLVa1NXVQa/Xw+12w+Px4N27d+jo6MCLFy/S+peXl2NzcxOKoqjmyFiBwsJCqkksFiNJjo2Nqfp//vyZQ0NDqrgoCAIySWtrKwDgx48fF3sZABAOhwEA9+/fV/XPz89HQUGBKp61De/duwcAePjwISorK7G7uwtFUdDU1ASLxQIAKC0tVfX3+Xyq7QcAEAQh4xHcvXuXiqLw69evXFtb4/n5OePxOBcXF/np0yeS5JMnT1T9p6eneXBwoN4p2QgA4PDwsOo9WF9fpyiKqr6PHj1iLBbj7du3VQnELipycnJSjCRJYktLC3t6eri/v0+SHB8fp81mY2FhYYr9xRj19fUkSYvFkp2ATqej3+9nW1sbATA/P58GgyFpbWxskCStVmsKJggCAdDr9bKrq+vnLRdFBgIBvnz5MjsBg8FAknz8+DGLiop4dnamWvp08vz5cwIgSb558yaRZGFhgaurq9cbRIeHh+ju7kZ9fX2SvrOzE8XFxXA6nZBlOaEPBAJwOp1pYy0vL2N0dBSSJKUOJFEU01YAAO12+5V3v7e3lxjHlytQVVVFkjSbzdcbxVNTUzg6OkJZWRm0Wq1qBQ4PD+F2uxGJRNLG2d3dxdHREZqbm/Hhw4erVwAArVZr1t3Pz88n7epyBQBwdnaWKysrmSsQDAaxvb0Nj8eT0K2srKC9vR2SJAEABgcHYTKZ8OzZM/j9fgDA5uZmyo53dnaSdMvLy5iZmUm9B6Io/nORUaahAoCrq6skyZqaGlWbvLy8FJ3JZCJJlpeXJ2OXCVxeBoOB79+/pyzL/P79O6PRKEkyGAwyEAjw4OCAnZ2dGUkDYFNTE0mmDq5sBPr6+rLegY8fP1Kv17O3t5d37txJG+fBgweMRCLMzc29HgGj0UhZllWTx+Nx9vf3U6fTcW9vjycnJ+zv7+etW7cSMfR6Pb1eLxcXF1NzaDSajAT+vxfhcJgTExOJsVtdXU2S7OvrS3pnPH36lMFgkF++fKHD4eDr16/p8Xjo9/tpNBpTY+MKEo/HQRKhUAiyLEOWZRwfHwMAotFowk5RFIyMjMBoNMLlcqG6uhpmsxlbW1tobGyEz+dLiZ31m/BXRJZl2O32K9n+lj8mmUQjiuLfZPajCIfDmJubw+npKYCf34iCIMDlciEUCv0yAUGj0URjsdiNHMVV5I8fgQDgHID03/PFFvktz/8C/6xwoasnBYAAAAAASUVORK5CYII=' >
844                        XRay pour SPIP
845                        </a>
846                </div>
847                </a>
848        </h1>
849        <div class="login">
850        <?php
851put_login_link();
852?>
853        </div>
854        <hr class="apc">
855</div>
856
857<?php
858// Display main Menu
859echo <<<EOB
860        <ol class=menu>
861        <li><a href="$MY_SELF&SH={$MYREQUEST['SH']}">Refresh Data</a></li>
862EOB;
863echo menu_entry(OB_HOST_STATS, 'View Host Stats'), menu_entry(OB_USER_CACHE, 'User Cache Entries'), menu_entry(OB_VERSION_CHECK, 'Version Check');
864
865if ($AUTHENTICATED) {
866        echo <<<EOB
867                <li><a class="aright" href="$MY_SELF&CC=1" onClick="javascript:return confirm('Are you sure?');">Clear Cache</a></li>
868EOB;
869}
870echo <<<EOB
871        </ol>
872EOB;
873
874
875// CONTENT
876echo <<<EOB
877        <div class=content>
878EOB;
879
880// MAIN SWITCH STATEMENT
881
882switch ($MYREQUEST['OB']) {
883        // -----------------------------------------------
884        // Host Stats
885        // -----------------------------------------------
886        case OB_HOST_STATS:
887                $mem_size         = $mem['num_seg'] * $mem['seg_size'];
888                $mem_avail        = $mem['avail_mem'];
889                $mem_used         = $mem_size - $mem_avail;
890                $seg_size         = bsize($mem['seg_size']);
891                $req_rate_user    = sprintf("%.2f", $cache['num_hits'] ? (($cache['num_hits'] + $cache['num_misses']) / ($time - $cache['start_time'])) : 0);
892                $hit_rate_user    = sprintf("%.2f", $cache['num_hits'] ? (($cache['num_hits']) / ($time - $cache['start_time'])) : 0);
893                $miss_rate_user   = sprintf("%.2f", $cache['num_misses'] ? (($cache['num_misses']) / ($time - $cache['start_time'])) : 0);
894                $insert_rate_user = sprintf("%.2f", $cache['num_inserts'] ? (($cache['num_inserts']) / ($time - $cache['start_time'])) : 0);
895                $apcversion       = phpversion('apcu');
896                $phpversion       = phpversion();
897                $number_vars      = $cache['num_entries'];
898                $size_vars        = bsize($cache['mem_size']);
899                $i                = 0;
900                $_namespace       = _CACHE_NAMESPACE;
901                echo <<< EOB
902                <div class="info div1"><h2>Mémoization SPIP</h2>
903                <table cellspacing=0><tbody>
904                <tr class=tr-0><td class=td-0>_CACHE_NAMESPACE</td><td>$_namespace</td></tr>
905                </table></div>
906EOB;
907                echo <<< EOB
908                <div class="info div1"><h2>General Cache Information</h2>
909                <table cellspacing=0><tbody>
910                <tr class=tr-0><td class=td-0>APCu Version</td><td>$apcversion</td></tr>
911                <tr class=tr-1><td class=td-0>PHP Version</td><td>$phpversion</td></tr>
912EOB;
913               
914                if (!empty($_SERVER['SERVER_NAME']))
915                        echo "<tr class=tr-0><td class=td-0>APCu Host</td><td>{$_SERVER['SERVER_NAME']} $host</td></tr>\n";
916                if (!empty($_SERVER['SERVER_SOFTWARE']))
917                        echo "<tr class=tr-1><td class=td-0>Server Software</td><td>{$_SERVER['SERVER_SOFTWARE']}</td></tr>\n";
918               
919                echo <<<EOB
920                <tr class=tr-0><td class=td-0>Shared Memory</td><td>{$mem['num_seg']} Segment(s) with $seg_size
921    <br/> ({$cache['memory_type']} memory)
922    </td></tr>
923EOB;
924                echo '<tr class=tr-1><td class=td-0>Start Time</td><td>', date(DATE_FORMAT, $cache['start_time']), '</td></tr>';
925                echo '<tr class=tr-0><td class=td-0>Uptime</td><td>', duration($cache['start_time']), '</td></tr>';
926                echo <<<EOB
927                </tbody></table>
928                </div>
929
930                <div class="info div1"><h2>Cache Information</h2>
931                <table cellspacing=0>
932                <tbody>
933                <tr class=tr-0><td class=td-0>Cached Variables</td><td>$number_vars ($size_vars)</td></tr>
934                        <tr class=tr-1><td class=td-0>Hits</td><td>{$cache['num_hits']}</td></tr>
935                        <tr class=tr-0><td class=td-0>Misses</td><td>{$cache['num_misses']}</td></tr>
936                        <tr class=tr-1><td class=td-0>Request Rate (hits, misses)</td><td>$req_rate_user cache requests/second</td></tr>
937                        <tr class=tr-0><td class=td-0>Hit Rate</td><td>$hit_rate_user cache requests/second</td></tr>
938                        <tr class=tr-1><td class=td-0>Miss Rate</td><td>$miss_rate_user cache requests/second</td></tr>
939                        <tr class=tr-0><td class=td-0>Insert Rate</td><td>$insert_rate_user cache requests/second</td></tr>
940                        <tr class=tr-1><td class=td-0>Cache full count</td><td>{$cache['expunges']}</td></tr>
941                </tbody>
942                </table>
943                </div>
944
945                <div class="info div2"><h2>Runtime Settings</h2><table cellspacing=0><tbody>
946EOB;
947               
948                $j = 0;
949                foreach (ini_get_all('apcu') as $k => $v) {
950                        echo "<tr class=tr-$j><td class=td-0>", $k, "</td><td>", str_replace(',', ',<br />', $v['local_value']), "</td></tr>\n";
951                        $j = 1 - $j;
952                }
953               
954                if ($mem['num_seg'] > 1 || $mem['num_seg'] == 1 && count($mem['block_lists'][0]) > 1)
955                        $mem_note = "Memory Usage<br /><font size=-2>(multiple slices indicate fragments)</font>";
956                else
957                        $mem_note = "Memory Usage";
958               
959                echo <<< EOB
960                </tbody></table>
961                </div>
962
963                <div class="graph div3"><h2>Host Status Diagrams</h2>
964                <table cellspacing=0><tbody>
965EOB;
966                $size = 'width=' . (GRAPH_SIZE * 2 / 3) . ' height=' . (GRAPH_SIZE / 2);
967                echo <<<EOB
968                <tr>
969                <td class=td-0>$mem_note</td>
970                <td class=td-1>Hits &amp; Misses</td>
971                </tr>
972EOB;
973               
974                echo graphics_avail() ? '<tr>' . "<td class=td-0><img alt='' $size src='{$IMG_BASE}&IMG=1&$time'></td>" . "<td class=td-1><img alt='' $size src='{$IMG_BASE}&IMG=2&$time'></td></tr>\n" : "", '<tr>', '<td class=td-0><span class="green box">&nbsp;</span>Free: ', bsize($mem_avail) . sprintf(" (%.1f%%)", $mem_avail * 100 / $mem_size), "</td>\n", '<td class=td-1><span class="green box">&nbsp;</span>Hits: ', $cache['num_hits'] . @sprintf(" (%.1f%%)", $cache['num_hits'] * 100 / ($cache['num_hits'] + $cache['num_misses'])), "</td>\n", '</tr>', '<tr>', '<td class=td-0><span class="red box">&nbsp;</span>Used: ', bsize($mem_used) . sprintf(" (%.1f%%)", $mem_used * 100 / $mem_size), "</td>\n", '<td class=td-1><span class="red box">&nbsp;</span>Misses: ', $cache['num_misses'] . @sprintf(" (%.1f%%)", $cache['num_misses'] * 100 / ($cache['num_hits'] + $cache['num_misses'])), "</td>\n";
975                echo <<< EOB
976                </tr>
977                </tbody></table>
978
979                <br/>
980                <h2>Detailed Memory Usage and Fragmentation</h2>
981                <table cellspacing=0><tbody>
982                <tr>
983                <td class=td-0 colspan=2><br/>
984EOB;
985               
986                // Fragementation: (freeseg - 1) / total_seg
987                $nseg = $freeseg = $fragsize = $freetotal = 0;
988                for ($i = 0; $i < $mem['num_seg']; $i++) {
989                        $ptr = 0;
990                        foreach ($mem['block_lists'][$i] as $block) {
991                                if ($block['offset'] != $ptr) {
992                                        ++$nseg;
993                                }
994                                $ptr = $block['offset'] + $block['size'];
995                                /* Only consider blocks <5M for the fragmentation % */
996                                if ($block['size'] < (5 * 1024 * 1024))
997                                        $fragsize += $block['size'];
998                                $freetotal += $block['size'];
999                        }
1000                        $freeseg += count($mem['block_lists'][$i]);
1001                }
1002               
1003                if ($freeseg > 1) {
1004                        $frag = sprintf("%.2f%% (%s out of %s in %d fragments)", ($fragsize / $freetotal) * 100, bsize($fragsize), bsize($freetotal), $freeseg);
1005                } else {
1006                        $frag = "0%";
1007                }
1008               
1009                if (graphics_avail()) {
1010                        $size = 'width=' . (2 * GRAPH_SIZE + 150) . ' height=' . (GRAPH_SIZE + 10);
1011                        echo <<<EOB
1012                        <img alt="" $size src="{$IMG_BASE}&IMG=3&$time">
1013EOB;
1014                }
1015                echo <<<EOB
1016                </br>Fragmentation: $frag
1017                </td>
1018                </tr>
1019EOB;
1020                if (isset($mem['adist'])) {
1021                        foreach ($mem['adist'] as $i => $v) {
1022                                $cur = pow(2, $i);
1023                                $nxt = pow(2, $i + 1) - 1;
1024                                if ($i == 0)
1025                                        $range = "1";
1026                                else
1027                                        $range = "$cur - $nxt";
1028                                echo "<tr><th align=right>$range</th><td align=right>$v</td></tr>\n";
1029                        }
1030                }
1031                echo <<<EOB
1032                </tbody></table>
1033                </div>
1034EOB;
1035               
1036                break;
1037       
1038       
1039        // -----------------------------------------------
1040        // User Cache Entries
1041        // -----------------------------------------------
1042        case OB_USER_CACHE:
1043                if (!$AUTHENTICATED) {
1044                        echo '<div class="error">You need to login to see the user values here!<br/>&nbsp;<br/>';
1045                        put_login_link("Login now!");
1046                        echo '</div>';
1047                        break;
1048                }
1049                $fieldname    = 'info';
1050                $fieldheading = 'User Entry Label';
1051                $fieldkey     = 'info';
1052               
1053                $cols = 6;
1054                echo <<<EOB
1055                <div class=sorting><form><p>Scope:
1056                <input type=hidden name=OB value={$MYREQUEST['OB']}>
1057                <input type=hidden name=exec value={$MYREQUEST['exec']}>
1058                <select name=SCOPE  onChange="form.submit()">
1059EOB;
1060                echo "<option value=A", $MYREQUEST['SCOPE'] == 'A' ? " selected" : "", ">Active</option>", "<option value=D", $MYREQUEST['SCOPE'] == 'D' ? " selected" : "", ">Deleted</option>", "</select>", ' Sorting:<select name=S_KEY  onChange="form.submit()">', "<option value=H", $MYREQUEST['S_KEY'] == 'H' ? " selected" : "", ">Hits</option>", "<option value=Z", $MYREQUEST['S_KEY'] == 'Z' ? " selected" : "", ">Size</option>", "<option value=S", $MYREQUEST['S_KEY'] == 'S' ? " selected" : "", ">$fieldheading</option>", "<option value=A", $MYREQUEST['S_KEY'] == 'A' ? " selected" : "", ">Last accessed</option>", "<option value=M", $MYREQUEST['S_KEY'] == 'M' ? " selected" : "", ">Last modified</option>", "<option value=C", $MYREQUEST['S_KEY'] == 'C' ? " selected" : "", ">Created at</option>", "<option value=D", $MYREQUEST['S_KEY'] == 'D' ? " selected" : "", ">Deleted at</option>";
1061                if ($fieldname == 'info')
1062                        echo "<option value=D", $MYREQUEST['S_KEY'] == 'T' ? " selected" : "", ">Timeout</option>";
1063                echo '</select>', '<select name=SORT  onChange="form.submit()">', '<option value=D', $MYREQUEST['SORT'] == 'D' ? ' selected' : '', '>DESC</option>', '<option value=A', $MYREQUEST['SORT'] == 'A' ? ' selected' : '', '>ASC</option>', '</select>', '&nbsp;&nbsp;<b>HTML:</b> ', '<select name=ZOOM  onChange="form.submit()">', '<option value=TEXTECOURT', $MYREQUEST['ZOOM'] == 'TEXTECOURT' ? ' selected' : '', '>Courts</option>', '<option value=TEXTELONG', $MYREQUEST['ZOOM'] == 'TEXTELONG' ? ' selected' : '', '>Entiers</option>', '</select>', '&nbsp;&nbsp;<b>Affichage extra:</b> ', '<select name=EXTRA  onChange="form.submit()">', '<option value="" ', $MYREQUEST['EXTRA'] == '' ? ' selected' : '', '></option>', '<option value=CONTEXTE ', $MYREQUEST['EXTRA'] == 'CONTEXTE' ? ' selected' : '', '>Contexte</option>', '<option value=CONTEXTES_SPECIAUX ', $MYREQUEST['EXTRA'] == 'CONTEXTES_SPECIAUX' ? ' selected' : '', '>Contextes spécifiques</option>', '<option value=INFO_AUTEUR ', $MYREQUEST['EXTRA'] == 'INFO_AUTEUR' ? ' selected' : '', '>Infos auteur</option>', '<option value=INVALIDEURS ', $MYREQUEST['EXTRA'] == 'INVALIDEURS' ? ' selected' : '', '>Invalideurs</option>', '<option value=INVALIDEURS_SPECIAUX ', $MYREQUEST['EXTRA'] == 'INVALIDEURS_SPECIAUX' ? ' selected' : '', '>Invalideurs spécifiques</option>', '</select>
1064                </p>', '<p><b>Types cache:</b> ', '<select name=TYPECACHE  onChange="form.submit()">', '<option value=ALL', $MYREQUEST['TYPECACHE'] == 'ALL' ? ' selected' : '', '>Tous</option>', '<option value=SESSIONS', $MYREQUEST['TYPECACHE'] == 'SESSIONS' ? ' selected' : '', '>Sessionnés</option>', '<option value=SESSIONS_AUTH', $MYREQUEST['TYPECACHE'] == 'SESSIONS_AUTH' ? ' selected' : '', '>Sessionnés identifiés</option>', '<option value=SESSIONS_NONAUTH', $MYREQUEST['TYPECACHE'] == 'SESSIONS_NONAUTH' ? ' selected' : '', '>Sessionnés non identifiés</option>', '<option value=FORMULAIRES', $MYREQUEST['TYPECACHE'] == 'FORMULAIRES' ? ' selected' : '', '>Formulaires</option>', '</select>', '<select name=COUNT onChange="form.submit()">', '<option value=10 ', $MYREQUEST['COUNT'] == '10' ? ' selected' : '', '>Top 10</option>', '<option value=20 ', $MYREQUEST['COUNT'] == '20' ? ' selected' : '', '>Top 20</option>', '<option value=50 ', $MYREQUEST['COUNT'] == '50' ? ' selected' : '', '>Top 50</option>', '<option value=100', $MYREQUEST['COUNT'] == '100' ? ' selected' : '', '>Top 100</option>', '<option value=150', $MYREQUEST['COUNT'] == '150' ? ' selected' : '', '>Top 150</option>', '<option value=200', $MYREQUEST['COUNT'] == '200' ? ' selected' : '', '>Top 200</option>', '<option value=500', $MYREQUEST['COUNT'] == '500' ? ' selected' : '', '>Top 500</option>', '<option value=0  ', $MYREQUEST['COUNT'] == '0' ? ' selected' : '', '>All</option>', '</select>', '&nbsp;&nbsp;&nbsp;Search: <input name=SEARCH value="', $MYREQUEST['SEARCH'], '" type=text size=25/>', '&nbsp;<input type=submit value="GO!">
1065                </p>', '</form></div>';
1066               
1067                if (isset($MYREQUEST['SEARCH'])) {
1068                        // Don't use preg_quote because we want the user to be able to specify a
1069                        // regular expression subpattern.
1070                        $MYREQUEST['SEARCH'] = '/' . str_replace('/', '\\/', $MYREQUEST['SEARCH']) . '/i';
1071                        if (preg_match($MYREQUEST['SEARCH'], 'test') === false) {
1072                                echo '<div class="error">Error: enter a valid regular expression as a search query.</div>';
1073                                break;
1074                        }
1075                }
1076                echo '<div class="info"><table cellspacing=0><tbody>', '<tr>', '<th>', sortheader('S', $fieldheading), '</th>', '<th>', sortheader('H', 'Hits'), '</th>', '<th>', sortheader('Z', 'Size'), '</th>', '<th>', sortheader('A', 'Last accessed'), '</th>', '<th>', sortheader('M', 'Last modified'), '</th>', '<th>', sortheader('C', 'Created at'), '</th>';
1077               
1078                if ($fieldname == 'info') {
1079                        $cols += 2;
1080                        echo '<th>', sortheader('T', 'Timeout'), '</th>';
1081                }
1082                echo '<th>', sortheader('D', 'Deleted at'), '</th></tr>';
1083               
1084                // builds list with alpha numeric sortable keys
1085                //
1086                $list = array();
1087               
1088                foreach ($cache[$scope_list[$MYREQUEST['SCOPE']]] as $i => $entry) {
1089                        switch ($MYREQUEST['S_KEY']) {
1090                                case 'A':
1091                                        $k = sprintf('%015d-', $entry['access_time']);
1092                                        break;
1093                                case 'H':
1094                                        $k = sprintf('%015d-', $entry['num_hits']);
1095                                        break;
1096                                case 'Z':
1097                                        $k = sprintf('%015d-', $entry['mem_size']);
1098                                        break;
1099                                case 'M':
1100                                        $k = sprintf('%015d-', $entry['mtime']);
1101                                        break;
1102                                case 'C':
1103                                        $k = sprintf('%015d-', $entry['creation_time']);
1104                                        break;
1105                                case 'T':
1106                                        $k = sprintf('%015d-', $entry['ttl']);
1107                                        break;
1108                                case 'D':
1109                                        $k = sprintf('%015d-', $entry['deletion_time']);
1110                                        break;
1111                                case 'S':
1112                                        $k = $entry["info"];
1113                                        break;
1114                        }
1115                        if (!$AUTHENTICATED) {
1116                                // hide all path entries if not logged in
1117                                $list[$k . $entry[$fieldname]] = preg_replace('/^.*(\\/|\\\\)/', '*hidden*/', $entry);
1118                        } else {
1119                                $list[$k . $entry[$fieldname]] = $entry;
1120                        }
1121                }
1122               
1123                if ($list) {
1124                        // sort list
1125                        //
1126                        switch ($MYREQUEST['SORT']) {
1127                                case "A":
1128                                        ksort($list);
1129                                        break;
1130                                case "D":
1131                                        krsort($list);
1132                                        break;
1133                                default:
1134                                        echo "...ah ben non pas de tri.";
1135                                        break;
1136                        }
1137                       
1138                        $TYPECACHE = (isset($MYREQUEST['TYPECACHE']) ? $MYREQUEST['TYPECACHE'] : 'ALL');
1139                        switch ($TYPECACHE) {
1140                                case 'ALL':
1141                                        $pattern_typecache = '';
1142                                        break;
1143                                case 'SESSIONS':
1144                                        $pattern_typecache = '/_([a-f0-9]{8}|)$/i';
1145                                        break;
1146                                case 'SESSIONS_AUTH':
1147                                        $pattern_typecache = '/_[a-f0-9]{8}$/i';
1148                                        break;
1149                                case 'SESSIONS_NONAUTH':
1150                                        $pattern_typecache = '/_$/i';
1151                                        break;
1152                                case 'FORMULAIRES':
1153                                        $pattern_typecache = '~formulaires/~i';
1154                                        break;
1155                        }
1156                       
1157                        // output list
1158                        $i = 0;
1159                        foreach ($list as $k => $entry) {
1160                               
1161                                if ((!$MYREQUEST['SEARCH'] || preg_match($MYREQUEST['SEARCH'], $entry[$fieldname])) and (!$pattern_typecache or preg_match($pattern_typecache, $entry[$fieldname]))) {
1162                                        $sh = md5($entry["info"]);
1163                                       
1164                                        $field_value = htmlentities(strip_tags($entry[$fieldname], ''), ENT_QUOTES, 'UTF-8');
1165                                        if (defined('XRAY_NEPASAFFICHER_DEBUTNOMCACHE'))
1166                                                $field_value = str_replace(XRAY_NEPASAFFICHER_DEBUTNOMCACHE, '...', $field_value);
1167                                        echo '<tr id="key-' . $sh . '" class=tr-', $i % 2, '>', "<td class='td-0' style='position: relative'>
1168                        <a href='$MY_SELF&SH={$sh}#key-{$sh}'>$field_value</a>";
1169                                       
1170                                        if ($p = preg_match('/_([0-9a-f]{8})$/i', $field_value, $match) and $MYREQUEST['SEARCH'] != "/{$match[1]}/i") {
1171                                                $url_session = parametre_url($MY_SELF, 'SEARCH', $match[1]);
1172                                                echo "<a href='$url_session' style='float: right'>[session]</a>";
1173                                        }
1174                                        if ($MYREQUEST['EXTRA'] and ($sh != $MYREQUEST["SH"]) // sinon yaura un zoom après et c'est inutile de répéter ici
1175                                                and apcu_exists($entry['info']) and ($data = apcu_fetch($entry['info'], $success)) and $success and is_array($data) and (count($data) == 1) and is_serialized($data[0])) {
1176                                                $data  = unserialize($data[0]);
1177                                                $extra = null;
1178                                                $liens = '';
1179                                                if (is_array($data)) {
1180                                                        switch ($MYREQUEST['EXTRA']) {
1181                                                                case 'CONTEXTE':
1182                                                                        if (isset($data['contexte']))
1183                                                                                $extra = $data['contexte'];
1184                                                                        else
1185                                                                                $extra = '(non défini)';
1186                                                                        break;
1187                                                                case 'CONTEXTES_SPECIAUX':
1188                                                                        if (isset($data['contexte'])) {
1189                                                                                $extra = $data['contexte'];
1190                                                                                foreach (array(
1191                                                                                        'lang',
1192                                                                                        'date',
1193                                                                                        'date_default',
1194                                                                                        'date_redac',
1195                                                                                        'date_redac_default'
1196                                                                                ) as $ki)
1197                                                                                        unset($extra[$ki]);
1198                                                                        } else
1199                                                                                $extra = '(non défini)';
1200                                                                        break;
1201                                                                case 'INFO_AUTEUR':
1202                                                                        if (isset($data['contexte'])) {
1203                                                                                foreach (array(
1204                                                                                        'id_auteur',
1205                                                                                        'email',
1206                                                                                        'nom',
1207                                                                                        'statut',
1208                                                                                        'login'
1209                                                                                ) as $ki)
1210                                                                                        if (isset($data['contexte'][$ki]))
1211                                                                                                $extra[$ki] = $extra[$ki] = $data['contexte'][$ki];
1212                                                                        };
1213                                                                        break;
1214                                                                case 'INVALIDEURS':
1215                                                                        $extra = $data['invalideurs'];
1216                                                                        break;
1217                                                                case 'INVALIDEURS_SPECIAUX':
1218                                                                        $extra = $data['invalideurs'];
1219                                                                        foreach (array(
1220                                                                                'cache',
1221                                                                                'session'
1222                                                                        ) as $ki)
1223                                                                                unset($extra[$ki]);
1224                                                                        break;
1225                                                        }
1226                                                }
1227                                                if ($extra == 'undefined')
1228                                                        $extra = array(
1229                                                                'contexte non défini' => 'vrai'
1230                                                        );
1231                                                if ($extra = print_contexte($extra, 1))
1232                                                        echo "<br><xmp>    $extra</xmp> <small style='float:right'>$liens</small>";
1233                                        }
1234                                        echo '</td>', '<td class="td-n center">', $entry['num_hits'], '</td>', '<td class="td-n right">', $entry['mem_size'], '</td>', '<td class="td-n center">', date(DATE_FORMAT, $entry['access_time']), '</td>', '<td class="td-n center">', date(DATE_FORMAT, $entry['mtime']), '</td>', '<td class="td-n center">', date(DATE_FORMAT, $entry['creation_time']), '</td>';
1235                                       
1236                                        if ($fieldname == 'info') {
1237                                                if ($entry['ttl'])
1238                                                        echo '<td class="td-n center">' . $entry['ttl'] . ' seconds</td>';
1239                                                else
1240                                                        echo '<td class="td-n center">None</td>';
1241                                        }
1242                                        if ($entry['deletion_time']) {
1243                                               
1244                                                echo '<td class="td-last center">', date(DATE_FORMAT, $entry['deletion_time']), '</td>';
1245                                        } else if ($MYREQUEST['OB'] == OB_USER_CACHE) {
1246                                               
1247                                                echo '<td class="td-last center">';
1248                                                echo '[<a href="', $MY_SELF, '&DU=', urlencode($entry[$fieldkey]), '">Delete Now</a>]';
1249                                                echo '</td>';
1250                                        } else {
1251                                                echo '<td class="td-last center"> &nbsp; </td>';
1252                                        }
1253                                        echo '</tr>';
1254                                        if ($sh == $MYREQUEST["SH"]) { // Le ZOOM sur une entrée
1255                                                echo '<tr>';
1256                                                echo '<td colspan="7"><pre>';
1257                                               
1258                                                if (isset($_GET['ZOOM']) and ($_GET['ZOOM'] == 'TEXTECOURT')) {
1259                                                        $url      = parametre_url($self, 'ZOOM', 'TEXTELONG') . "#key-$sh";
1260                                                        $menuzoom = "<a href='$url'>[Voir tout le texte]</a> ";
1261                                                } else {
1262                                                        $url      = parametre_url($self, 'ZOOM', 'TEXTECOURT') . "#key-$sh";
1263                                                        $menuzoom = "<a href='$url'>[Voir texte abbrégé]</a> ";
1264                                                }
1265                                                $url = parametre_url($self, 'SH', '') . "#key-$sh";
1266                                                $menuzoom .= "<a href='$url'>[Replier]</a>";
1267                                               
1268                                                if (apcu_exists($entry['info'])) {
1269                                                        $d = apcu_fetch($entry['info'], $success);
1270                                                        if ($success) {
1271                                                                echo $menuzoom . "<br>";
1272                                                                if (is_array($d) and (count($d) == 1) and is_serialized($d[0]))
1273                                                                        echo "<xmp>" . spipsafe_unserialize($d[0]) . "</xmp>";
1274                                                                else
1275                                                                        echo "fetch ok<br><xmp>" . print_r($d, 1) . "</xmp>";
1276                                                        } else
1277                                                                echo "fetch failed";
1278                                                } else
1279                                                        echo '(doesnt exist)';
1280                                                echo '</pre></td>';
1281                                                echo '</tr>';
1282                                        }
1283                                        $i++;
1284                                        if ($i == $MYREQUEST['COUNT'])
1285                                                break;
1286                                }
1287                        }
1288                       
1289                } else {
1290                        echo '<tr class=tr-0><td class="center" colspan=', $cols, '><i>No data</i></td></tr>';
1291                }
1292                echo <<< EOB
1293                </tbody></table>
1294EOB;
1295               
1296                if ($list && $i < count($list)) {
1297                        echo "<a href=\"$MY_SELF", "&COUNT=0\"><i>", count($list) - $i, ' more available...</i></a>';
1298                }
1299               
1300                echo <<< EOB
1301                </div>
1302EOB;
1303                break;
1304       
1305        // -----------------------------------------------
1306        // Version check
1307        // -----------------------------------------------
1308        case OB_VERSION_CHECK:
1309                echo <<<EOB
1310                <div class="info"><h2>APCu Version Information</h2>
1311                <table cellspacing=0><tbody>
1312                <tr>
1313                <th></th>
1314                </tr>
1315EOB;
1316                if (defined('PROXY')) {
1317                        $ctxt = stream_context_create(array(
1318                                'http' => array(
1319                                        'proxy' => PROXY,
1320                                        'request_fulluri' => True
1321                                )
1322                        ));
1323                        $rss  = @file_get_contents("http://pecl.php.net/feeds/pkg_apcu.rss", False, $ctxt);
1324                } else {
1325                        $rss = @file_get_contents("http://pecl.php.net/feeds/pkg_apcu.rss");
1326                }
1327                if (!$rss) {
1328                        echo '<tr class="td-last center"><td>Unable to fetch version information.</td></tr>';
1329                } else {
1330                        $apcversion = phpversion('apcu');
1331                       
1332                        preg_match('!<title>APCu ([0-9.]+)</title>!', $rss, $match);
1333                        echo '<tr class="tr-0 center"><td>';
1334                        if (version_compare($apcversion, $match[1], '>=')) {
1335                                echo '<div class="ok">You are running the latest version of APCu (' . $apcversion . ')</div>';
1336                                $i = 3;
1337                        } else {
1338                                echo '<div class="failed">You are running an older version of APCu (' . $apcversion . '),
1339                                newer version ' . $match[1] . ' is available at <a href="http://pecl.php.net/package/APCu/' . $match[1] . '">
1340                                http://pecl.php.net/package/APCu/' . $match[1] . '</a>
1341                                </div>';
1342                                $i = -1;
1343                        }
1344                        echo '</td></tr>';
1345                        echo '<tr class="tr-0"><td><h3>Change Log:</h3><br/>';
1346                       
1347                        preg_match_all('!<(title|description)>([^<]+)</\\1>!', $rss, $match);
1348                        $changelog = $match[2];
1349                       
1350                        for ($j = 2; $j + 1 < count($changelog); $j += 2) {
1351                                $v = $changelog[$j];
1352                                if ($i < 0 && version_compare($apcversion, $ver, '>=')) {
1353                                        break;
1354                                } else if (!$i--) {
1355                                        break;
1356                                }
1357                                list($unused, $ver) = $v;
1358                                $changes = $changelog[$j + 1];
1359                                echo "<b><a href=\"http://pecl.php.net/package/APCu/$ver\">" . htmlspecialchars($v, ENT_QUOTES, 'UTF-8') . "</a></b><br><blockquote>";
1360                                echo nl2br(htmlspecialchars($changes, ENT_QUOTES, 'UTF-8')) . "</blockquote>";
1361                        }
1362                        echo '</td></tr>';
1363                }
1364                echo <<< EOB
1365                </tbody></table>
1366                </div>
1367EOB;
1368                break;
1369               
1370}
1371
1372echo <<< EOB
1373        </div>
1374EOB;
1375
1376?>
1377
1378<!-- <?php
1379echo "\nBased on APCGUI By R.Becker\n$VERSION\n";
1380?> -->
1381</body>
1382</html>
Note: See TracBrowser for help on using the repository browser.