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

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

dans les listes de cachelab_diag, des liens vers le détail du cache + fix recherche de caractères spéciaux dans les noms + suivre cachelab

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