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

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

nouvelle visu : liste des <INCLURE> dans un squelette

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