Maison  >  Article  >  développement back-end  >  Méthode PHP pour empêcher la session d'expirer

Méthode PHP pour empêcher la session d'expirer

*文
*文original
2018-05-18 09:41:454668parcourir

Cet article présente principalement une explication approfondie de la session PHP et comment l'empêcher d'expirer, y compris une explication du mécanisme de recyclage de session et une solution au problème du SessionId restant inchangé. J'espère que cela aide tout le monde.

La technologie COOKIE est utilisée dans la mise en œuvre de SESSION. SESSION enregistrera un COOKIE contenant l'identifiant de session (numéro de SESSION) côté client ; d'autres variables de session, telles que le nom de session, etc., seront enregistrées côté serveur ; . Lorsque l'utilisateur demande au serveur, le session_id est également envoyé au serveur. En extrayant les variables enregistrées côté serveur via le session_id, vous pouvez identifier qui est l'utilisateur. En même temps, il n'est pas difficile de comprendre pourquoi SESSION échoue parfois.

Lorsque le client désactive le COOKIE (cliquez sur "Outils" - "Options Internet" dans IE, cliquez sur "Sécurité" - "Niveau personnalisé" dans la boîte de dialogue contextuelle, modifiez "Autoriser chaque conversation" COOKIE" est défini sur désactivé), session_id ne sera pas transmis et SESSION ne sera pas valide à ce moment-là. Cependant, php5 peut vérifier automatiquement l'état des cookies sur la plateforme Linux/Unix. Si le client est désactivé, le système ajoutera automatiquement le session_id à l'URL et le transmettra. Les hôtes Windows n'ont pas cette fonction.

Sujet d'apprentissage du site Web chinois php : session php (comprenant des images, des vidéos, des cas)

Commun fonctions et utilisation de Session ?
Session_start() : Démarre une session ou renvoie une session existante.
Remarque : cette fonction n'a aucun paramètre et la valeur de retour est vraie. Si vous utilisez des sessions basées sur des cookies, le navigateur ne doit avoir aucune sortie avant d'utiliser Session_start(), sinon l'erreur suivante se produira :
Avertissement : Impossible d'envoyer le limiteur de cache de session - en-têtes déjà envoyés (sortie démarrée à /usr/local /apache/htdocs/cga/member/1.php:2)…………

Vous pouvez démarrer session.auto_start=1 dans php.ini, vous n'avez donc pas besoin de le démarrer à chaque fois Session_start () doit être appelé avant d'utiliser la session. Mais il existe certaines limitations à l'activation de cette option, si session.auto_start est effectivement activé, vous ne pouvez pas mettre d'objets dans la session car la définition de classe doit être chargée avant de démarrer la session pour recréer l'objet dans la session.
Toutes les variables enregistrées seront sérialisées une fois la demande terminée. Les variables enregistrées mais non définies sont marquées comme non définies. Ces variables ne sont pas non plus définies par le module de session lors des accès ultérieurs, sauf si l'utilisateur les définit ultérieurement.

Attention : Certains types de données ne peuvent pas être sérialisées et ne peuvent donc pas être enregistrées dans la session. Y compris des variables de ressources ou des objets avec des références circulaires (c'est-à-dire qu'un objet transmet une référence à lui-même à un autre objet).

Enregistrer la variable SESSION :
PHP5 utilise $_SESSION['xxx']=xxx pour enregistrer la variable globale SESSION. Les méthodes d'utilisation de GET, POST et COOKIE sont similaires.
Remarque : session_register(), session_unregister, session_is_registered ne sont plus utilisés sous php5, sauf si register_globle est activé dans php.ini. Cependant, pour des raisons de sécurité, il est fortement recommandé de désactiver register_globle. L'utilisation de HTTP_SESSION_VARS n'est plus recommandée et la recommandation officielle est d'utiliser $_SESSION à la place. Par exemple :

Page1.php

  <?php
  Session_start(); //使用SESSION前必须调用该函数。

  $_SESSION[‘name&#39;]=”我是黑旋风李逵!”; //注册一个SESSION变量

  $_SESSION[‘passwd&#39;]=”mynameislikui”;
  $_SESSION[‘time&#39;]=time();
  echo &#39;
  通过COOKIE传递SESSION&#39;; //如果客户端支持cookie,可通过该链接传递session到下一页。

  echo &#39;
  . SID . &#39;">通过URL传递SESSION&#39;;//客户端不支持cookie时,使用该办法传递session.

  ?>

Page2.php

  <?php
  session_start();
  echo $_SESSION[&#39;name&#39;]; //

  echo $_SESSION[&#39;passwd&#39;]; //

  echo date(&#39;Y m d H:i:s&#39;, $_SESSION[&#39;time&#39;]);
  echo &#39;
  返回山一页&#39;;
  ?>

Il existe deux façons de transmettre un identifiant de session :

  1. cookie

  2. Paramètres URL

Le module de session prend en charge les deux méthodes. Les cookies sont plus optimisés, mais comme ils ne sont pas toujours disponibles, des alternatives sont également proposées. La deuxième méthode intègre l'ID de session directement au milieu de l'URL.

PHP peut convertir les connexions de manière transparente. Sauf si vous utilisez PHP 4.2 ou une version plus récente, vous devez l'activer manuellement lors de la compilation de PHP. Sous Unix, utilisez l'option de configuration --enable-trans-sid. Si cette option de configuration et l'option d'exécution session.use_trans_sid sont toutes deux activées (php.ini modifié), l'URI relatif sera automatiquement modifié pour inclure l'ID de session.

session_id
session_id() est utilisé pour définir ou obtenir le session_id actuel. En php5, vous pouvez soit utiliser session_id(), soit obtenir le session_id et le session_name de la session en cours via le SID attaché à l'url.
Si session_id() a une valeur spécifique, elle remplacera la valeur session_id actuelle. La session doit être démarrée avant d'utiliser cette fonction : session_start();
Lorsque nous utilisons des cookies de session, si une valeur session_id() est spécifiée, une valeur de cookie sera envoyée au client à chaque démarrage de session_start(). Que le session_id actuel soit égal ou non à la valeur spécifiée.
session_id() renvoie le session_id() actuel si aucune valeur n'est spécifiée ; si la session en cours n'est pas démarrée, elle renvoie une chaîne vide.

Vérifier si la session existe ?
Dans les versions précédentes de PHP, session_is_register() était généralement utilisé pour vérifier si la session existe. Si vous utilisez $_SESSION['XXX']=XXX pour enregistrer les variables de session, la fonction session_is_register() ne fonctionne plus. Vous pouvez utiliser
isset($_SESSION['xxx']) à la place.

Change session_id session_regenerate_id() renvoie true si le changement réussit et false s'il échoue.
L'utilisation de cette fonction peut modifier le session_id de la session en cours, mais ne modifie pas les autres informations de la session en cours. Par exemple :

  <?php
  session_start();
  $old_sessionid = session_id();
  session_regenerate_id();
  $new_sessionid = session_id();
  echo "原始 SessionID: $old_sessionid
  ";
  echo "新的 SessionID: $new_sessionid
  ";
  echo"

  ";

  print_r($_SESSION);
  echo"";
  ?>

session_name() 返回当前session的name或改变当前session的name。如果要改变当前session的name,必须在session_start() 之前调用该函数。注意:session_name不能只由数字组成,它至少包含一个字母。否则会在每时每刻都生成一个新的session id.
session改名示例:

$previous_name = session_name("WebsiteID");
echo "新的session名为: $previous_name
";
?>

如何删除session?
1、unset ($_SESSION['xxx']) 删除单个session,unset($_SESSION['xxx']) 用来unregister一个已注册的session变量。其作用和session_unregister()相同。 session_unregister()在PHP5中不再使用,可将之打入冷宫。
unset($_SESSION) 此函数千万不可使用,它会将全局变量$_SESSION销毁,而且还没有可行的办法将其恢复。用户也不再可以注册$_SESSION变量。
2、$_SESSION=array() 删除多个session
3、 session_destroy()结束当前的会话,并清空会话中的所有资源。。该函数不会unset(释放)和当前session相关的全局变量 (globalvariables),也不会删除客户端的session cookie.PHP默认的session是基于cookie的,如果要删除cookie的话,必须借助setcookie()函数。
返回值:布尔值。
功能说明:这个函数结束当前的session,此函数没有参数,且返回值均为true

session_unset() 如果使用了$_SESSION,则该函数不再起作用。由于PHP5必定要使用$_SESSION,所以此函数可以打入冷宫了。

下面是PHP官方关于删除session的案例:

  <?php
  // 初始化session.

  session_start();
  /*** 删除所有的session变量..也可用unset($_SESSION[xxx])逐个删除。****/
  $_SESSION = array();
  /***删除sessin id.由于session默认是基于cookie的,所以使用setcookie删除包含session id的cookie.***/
  if (isset($_COOKIE[session_name()])) {
  setcookie(session_name(), &#39;&#39;, time()-42000, &#39;/&#39;);
  }

// 最后彻底销毁session.

  session_destroy();
  ?>

由此我们可以得出删除Session的步骤:

  1. session_start()

  2. $_SESSION=array()/unset($_SESSION['xxx'])

  3. session_destroy()

解决PHP Session不过期以及SessionId保持不变的问题

session 回收机制:
 
PHP采用Garbage Collection process对过期session进行回收,然而并不是每次session建立时,都能够唤起 ‘garbage collection' process ,gc是按照一定概率启动的。这主要是出于对服务器性能方面的考虑,每个session都触发gc,浏览量大的话,服务器吃不消,然而按照一定概率开启gc,当流览量大的时候,session过期机制能够正常运行,而且服务器效率得到节省。细节应该都是多年的经验积累得出的。
三个与PHP session过期相关的参数(php.ini中):

  1. session.gc_probability = 1

  2. session.gc_pisor = 1000

  3. session.gc_maxlifetime = 1440

gc启动概率 = gc_probability / gc_pisor = 0.1%
session过期时间 gc_maxlifetime 单位:秒 
当web服务正式提供时,session过期概率就需要根据web服务的浏览量和服务器的性能来综合考虑session过期概率。为每个session都开启gc,显然是不明智的,感觉有点“碰运气”的感觉,要是访问量小命中几率就小。我在本机测试过程中,几乎都没有被命中过,sessionid几天都不变,哪怕机器重启。测试过程中,这个过期概率值要设置大一点命中几率才高点。
通过修改php配置文件的过期概率值,可以“碰运气”式的设置session过期,那有没有更好的办法呢?

下面写的这个session类可以彻底解决session不过期以及sessionid不变的问题。

<?php
 /**
 * 扩展Session类(简单封装)
 * 
 * @author slimboy
 *
 */
class Session { 
 
   /**
   * 初始化
   */
  static function _init(){ 
    ini_set(&#39;session.auto_start&#39;, 0); 
    //Session::start(); 
   } 
   
   /**
   * 启动Session
   */
  static function start() { 
    session_start(); 
  } 
 
   /**
   * 设置Session
   * 
   * @param $name Session名称
   * @param $value 值
   * @param $time 超时时间(秒)
   */
  public static function set($name,$value,$time){ 
    if(empty($time)){ 
      $time = 1800; //默认值 
     } 
    $_SESSION[$name] = $value; 
    $_SESSION[$name.&#39;_Expires&#39;] = time() + $time; 
  } 
   
   /**
   * 获取Session值
   * 
   * @param $name Session名称
   */
  public static function get($name){ 
    //检查Session是否已过期 
     if(isset($_SESSION[$name.&#39;_Expires&#39;]) && $_SESSION[$name.&#39;_E
 xpires&#39;]>time()){ 
      return $_SESSION[$name]; 
    }else{ 
      Session::clear($name); 
      return null; 
    } 
  } 
   
    
   /**
   * 设置Session Domain
   * 
   * @param $sessionDomain 域
   * @return string
   */
  static function setDomain($sessionDomain = null) { 
    $return = ini_get(&#39;session.cookie_domain&#39;); 
    if(!empty($sessionDomain)) { 
      ini_set(&#39;session.cookie_domain&#39;, $sessionDomain);//跨
 域访问Session 
     } 
    return $return; 
  } 
   
    
   /**
   * 清除某一Session值
   * 
   * @param $name Session名称
   */
  static function clear($name){ 
    unset($_SESSION[$name]); 
    unset($_SESSION[$name.&#39;_Expires&#39;]); 
  } 
   
    
   /**
   * 重置销毁Session
   */
  static function destroy(){ 
    unset($_SESSION); 
    session_destroy(); 
  } 
   
    
   /**
   * 获取或设置Session id
   */
  static function sessionid($id=null){ 
    return session_id($id); 
  } 
 
}
?>
简单调用:
 
<?php
  //设置session 
  Session::set(&#39;UserId&#39;, $userid, 3600); 
  //读取session
  $userId = Session::get(&#39;UserId&#39;);
?>

相关推荐:

php Session的简介

PHP高级教程:PHP Cookies

php Cookies操作类(附源码)

 

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn