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

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

grâce à la construction 'use' de php, on peut éviter une globale pour la callback

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