Source for file session.php

Documentation is available at session.php

  1. <?php
  2. /**
  3.  * Session constants and tools
  4.  *
  5.  * @author    Jean-Philippe Brunon <jp75018@free.fr>
  6.  * @copyright    2007-2009 Jean-Philippe Brunon
  7.  * @license    http://www.opensource.org/licenses/gpl-license.php GPL
  8.  * @package    php-endurance
  9.  * @version    $Id: session.php 66 2009-03-26 10:39:25Z jp75018 $
  10.  */
  11.  
  12. /**
  13.  * General configuration file
  14.  */
  15. require_once ('conf/config.php');
  16.  
  17. /**
  18.  * Recursive delete mode : Remove only files (keep directory structure intact)
  19.  */
  20. define('DIR_REMOVE_FILE'1);
  21. /**
  22.  * Recursive delete mode : Remove all except root directory
  23.  */
  24. define('DIR_REMOVE_SUBDIR'2);
  25. /**
  26.  * Recursive delete mode : Remove all
  27.  */
  28. define('DIR_REMOVE_ALL'3);
  29.  
  30. /**
  31.  * Session start
  32.  *
  33.  * Call instead of session_start() to start sessions.
  34.  * Cleanup temporary files
  35.  * ($GLOBALS['tmp_dir'] and $GLOBALS['upload_dir'] directories).
  36.  *
  37.  * @return      void 
  38.  */
  39. function plw_session_start()
  40. {
  41. // Set session timeout
  42.   @ini_set('session.gc_maxlifetime'$GLOBALS['session_gc_maxlifetime']);
  43.  
  44.  
  45.   $ts time();
  46.  
  47.   $lang null;
  48.   if (isset($_POST['lang']))
  49.   unset($_SESSION['lang'])}        // Language change
  50.   if (isset($_SESSION['lang']))
  51.   $lang $_SESSION['lang']}    // Language already set in session
  52.   if (($lang&& isset($_POST['lang']))
  53.   {
  54.   // Case of language change
  55.     $lang strtolower(substr($_POST['lang']02));
  56.     if (file_exists('lang/strings_' $lang '.inc.php'))
  57.     $lang null}
  58.   }
  59.   if ($lang)
  60.   {
  61.   // Language stored in cookie?
  62.     if ($_COOKIE['lang'])
  63.     $lang $_COOKIE['lang']}
  64.   }
  65.   if ($lang)
  66.   {
  67.   // If no language : Use browser language if supported, else use def language
  68.     if ($lang get_browser_language($_SERVER['HTTP_ACCEPT_LANGUAGE']))
  69.     {
  70.       $lang strtolower(substr($lang02));    // Consider main language only
  71.       if (file_exists('lang/strings_' $lang '.inc.php'))
  72.       $lang null}
  73.     }
  74.   }
  75.   if ($lang)
  76.   $lang $GLOBALS['def_lang']}        // If still KO => Get default language
  77.   set_language($lang);
  78.  
  79. // Get browser width and height
  80.   if (is_numeric($_COOKIE['browser_width']))
  81.   $_SESSION['browser_width'$_COOKIE['browser_width']}
  82.   else
  83.   unset($_SESSION['browser_width'])}
  84.  
  85. // Get preferences from cookies
  86.   $_SESSION['pref_display_width'$_COOKIE['pref_display_width'];
  87.  
  88. // Cleanup tmp and upload directories
  89.   if ((($_SESSION['http_count']+$ts100$GLOBALS['garbage_collect_proba'])
  90.   {
  91.     $d dir($GLOBALS['tmp_dir']);
  92.     while (($file $d->read()) !== false)
  93.     {
  94.       if (($file == '.'|| ($file == '..'))
  95.       continue}
  96.       if (@is_dir($file))
  97.       {
  98.     if (($ts @filemtime($GLOBALS['tmp_dir'$file)) >=
  99.       $GLOBALS['tmp_files_duration'])
  100.     @unlink($GLOBALS['tmp_dir'$file)}
  101.       }
  102.     }
  103.     $d->close();
  104.  
  105.   // Cleanup all users upload directories (recursive)
  106.   // Do not remove 'upload' directory itself, even if empty
  107.     remove_dir_recursive($GLOBALS['upload_dir'],
  108.       $GLOBALS['upload_files_duration']DIR_REMOVE_SUBDIR$ts);
  109.   }
  110.  
  111. // Always cleanup user upload directory (recursive)
  112.   if ($_SESSION['my_user_id'])
  113.   {
  114.     remove_dir_recursive($GLOBALS['upload_dir'.
  115.     str_pad($_SESSION['my_user_id']6'0'STR_PAD_LEFT),
  116.       $GLOBALS['upload_files_duration']DIR_REMOVE_ALL$ts);
  117.   }
  118.  
  119.   $_SESSION['http_count']++;
  120. }
  121.  
  122. /**
  123.  * Get language from browser language string (take preferred language)
  124.  *
  125.  * @param       string    $browser_language Browser language string
  126.  * @return      string     Language ISO code : xx or xx-YY of preferred language
  127.  *             or null if no language found
  128.  */
  129. function get_browser_language($browser_language)
  130. {
  131.   if ($browser_language)
  132.   return null}
  133.  
  134.   $lang_tab explode(','$browser_language);
  135.   $max_priority 0;
  136.   $lang null;
  137.   for ($i 0$i count($lang_tab)$i++)
  138.   {
  139.     if (preg_match('/^\s*([^;\s]+)\s*(;\s*q\s*=\s*([0-9]*\.?[0-9]*))?\s*$/i',
  140.       $lang_tab[$i]$matches))
  141.     {
  142.       $priority 1;
  143.       if ($matches[3])
  144.       $priority $matches[3]}
  145.       if ($priority $max_priority)
  146.       {
  147.     $lang $matches[1];
  148.           $max_priority $priority;
  149.       }
  150.     }
  151.   }
  152.  
  153.   return $lang;
  154. }
  155.  
  156. /**
  157.  * Set language in session
  158.  *
  159.  * @param       string  $lang Language to set (2 letters ISO code)
  160.  * @return      void 
  161.  */
  162. function set_language($lang)
  163. {
  164.   if ($lang && ($lang != $_SESSION['lang']))
  165.   require_once ('lang/strings_' $lang '.inc.php')}
  166.   $_SESSION['lang'$lang;
  167.   $GLOBALS['lang'$lang;
  168. }
  169.  
  170. /**
  171.  * Get total size of files in a directory (recursively or not)
  172.  *
  173.  * Note : Each file size is rounded up assuming default block size.
  174.  *
  175.  * @param       string    $dir_name Directory name (relative to site root)
  176.  * @param       string  $recur true to consider subdirectories, else false
  177.  * @return      integer Cumulated size in bytes, 0 on error
  178.  */
  179. function dir_size_recursive($dir_name$recur true)
  180. {
  181.   $cum_size 0;
  182.  
  183.   $dir_handler @dir($dir_name);
  184.   if ($dir_handler)
  185.   return 0}
  186.  
  187.   while (($entry $dir_handler->read()) !== false)
  188.   {
  189.     if (($entry == '.'|| ($entry == '..'|| ($entry == '.svn'))
  190.     continue}
  191.  
  192.     $entry $dir_name '/' $entry;
  193.     $file_stat @stat($entry);
  194.     if (is_array($file_stat))
  195.     {
  196.       $file_size $file_stat['size'($file_size 1);
  197.       $cum_size += $GLOBALS['fs_block_size'*
  198.     ceil($file_size $GLOBALS['fs_block_size']);
  199.     }
  200.  
  201.     if (@is_dir($entry))
  202.     $cum_size += dir_size_recursive($entry$recur)}
  203.   }
  204.  
  205.   $dir_handler->close();
  206.  
  207.   return $cum_size;
  208. }
  209.  
  210. /**
  211.  * Recursive delete a directory
  212.  *
  213.  * Remove subdirs / dir only if all files in subdirs / dir are removed.
  214.  *
  215.  * @param       string  $dir_name Directory name (relative to site root)
  216.  * @param       integer $age Remove only files modified more than <age>
  217.  *             seconds ago (all if = 0)
  218.  * @param       string  $mode Delete mode (see DIR_REMOVE_*)
  219.  * @param       integer $ts Current timestamp. Do not use, avoid calling time().
  220.  * @return      boolean true if directory was removed, else false.
  221.  */
  222. function remove_dir_recursive($dir_name,
  223.   $age 0$mode DIR_REMOVE_SUBDIR$ts null)
  224. {
  225.   $dir_handler @dir($dir_name);
  226.   if ($dir_handler)
  227.   return false}
  228.  
  229.   if ($ts)
  230.   $ts time()}
  231.  
  232.   $entry_nb 0;
  233.   $del_nb 0;
  234.   while (($entry $dir_handler->read()) !== false)
  235.   {
  236.     if (($entry == '.'|| ($entry == '..'|| ($entry == '.svn'))
  237.     continue}
  238.  
  239.     $entry_nb++;
  240.     $entry $dir_name '/' $entry;
  241.     if (@is_dir($entry))
  242.     {
  243.       if (remove_dir_recursive($entry$age,
  244.     ($mode == DIR_REMOVE_FILEDIR_REMOVE_FILE DIR_REMOVE_ALL$ts))
  245.       $del_nb++}
  246.     }
  247.     else
  248.     {
  249.       $file_stat @stat($entry);
  250.       if (is_array($file_stat))
  251.       {
  252.     $file_age $ts $file_stat['mtime'];
  253.     if ($file_age >= $age)
  254.     {
  255.       if (@unlink($entry))
  256.       $del_nb++}
  257.     }
  258.       }
  259.     }
  260.   }
  261.   $dir_handler->close();
  262.  
  263. // Remove directory if empty
  264.   $ret_value false;
  265.   if ($mode == DIR_REMOVE_ALL)
  266.   {
  267.     if ($entry_nb == $del_nb)
  268.     {
  269.       if (@rmdir($dir_name))
  270.       $ret_value true}
  271.     }
  272.   }
  273.  
  274.   return $ret_value;
  275. }
  276.  
  277. /**
  278.  * Start timer to measure performance
  279.  *
  280.  * @return      float   Unix timestamp in microseconds.
  281.  */
  282. function timer_start()
  283. {
  284.   list($usec$secexplode(" "microtime());
  285.  
  286.   return ((float)$usec + (float)$sec);
  287. }
  288.  
  289. /**
  290.  * Stop timer to measure performance
  291.  *
  292.  * @param       float   $start Timestamp returned by timer_start().
  293.  * @return      float   Elapsed real time in microseconds between timer_start()
  294.  *             and timer_stop().
  295.  */
  296. function timer_stop($start)
  297. {
  298.   return round(1000000 (timer_start($start));
  299. }

Documentation generated on Sat, 28 Mar 2009 23:17:13 +0000 by phpDocumentor 1.4.1