Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Methode, um zu verhindern, dass die Sitzung abläuft

PHP-Methode, um zu verhindern, dass die Sitzung abläuft

*文
*文Original
2018-05-18 09:41:454648Durchsuche

Dieser Artikel enthält hauptsächlich eine ausführliche Erklärung der PHP-Sitzung und wie man verhindert, dass sie abläuft, einschließlich einer Erklärung des Sitzungsrecyclingmechanismus und einer Lösung für das Problem, dass die SessionId unverändert bleibt. Ich hoffe, es hilft allen.

COOKIE-Technologie wird bei der Implementierung von SESSION verwendet. Auf der Clientseite wird ein COOKIE mit der Sitzungs-ID (SESSION-Nummer) gespeichert. Andere Sitzungsvariablen wie Sitzungsname usw. werden auf der Serverseite gespeichert . Wenn der Benutzer den Server anfordert, wird auch die Sitzungs-ID an den Server gesendet. Durch Extrahieren der auf der Serverseite gespeicherten Variablen können Sie den Benutzer identifizieren. Gleichzeitig ist es nicht schwer zu verstehen, warum SESSION manchmal fehlschlägt.

Wenn der Client COOKIE deaktiviert (klicken Sie im IE auf „Extras“ – „Internetoptionen“, klicken Sie im Popup-Dialogfeld auf „Sicherheit“ – „Stufe anpassen“ und ändern Sie „Jede Konversation zulassen“. COOKIE) auf „disabled“ gesetzt ist), session_id wird nicht übergeben und SESSION ist zu diesem Zeitpunkt ungültig. PHP5 kann jedoch den Cookie-Status auf der Linux/Unix-Plattform automatisch überprüfen. Wenn der Client deaktiviert ist, hängt das System die session_id automatisch an die URL an und übergibt sie. Windows-Hosts verfügen nicht über diese Funktion.

PHP-Lernthema für chinesische Websites: PHP-Sitzung (einschließlich Bilder, Videos, Fälle)

Häufig Funktionen und Nutzung von Session?
Session_start(): Eine Sitzung starten oder eine bestehende Sitzung zurückgeben.
Hinweis: Diese Funktion hat keine Parameter und der Rückgabewert ist wahr. Wenn Sie Cookie-basierte Sitzungen verwenden, darf der Browser vor der Verwendung von Session_start() keine Ausgabe haben, andernfalls tritt der folgende Fehler auf:
Warnung: Session-Cache-Limiter kann nicht gesendet werden – Header bereits gesendet (Ausgabe wurde unter /usr/local gestartet /apache/htdocs/cga/member/1.php:2)…………

Sie können session.auto_start=1 in php.ini starten, sodass Sie es nicht jedes Mal bei Session_start starten müssen () muss vor der Verwendung der Sitzung aufgerufen werden. Es gibt jedoch einige Einschränkungen bei der Aktivierung dieser Option. Wenn session.auto_start tatsächlich aktiviert ist, können Sie keine Objekte in die Sitzung einfügen, da die Klassendefinition vor dem Start der Sitzung geladen werden muss, um das Objekt in der Sitzung neu zu erstellen.
Alle registrierten Variablen werden nach Abschluss der Anfrage serialisiert. Registrierte, aber nicht definierte Variablen werden als undefiniert markiert. Diese Variablen werden auch bei späteren Zugriffen nicht vom Sitzungsmodul definiert, es sei denn, der Benutzer definiert sie später.

Warnung: Einige Datentypen können nicht serialisiert und daher nicht in der Sitzung gespeichert werden. Einschließlich Ressourcenvariablen oder Objekten mit Zirkelverweisen (d. h. ein Objekt übergibt einen Verweis auf sich selbst an ein anderes Objekt).

SESSION-Variable registrieren:
PHP5 verwendet $_SESSION[‘xxx’]=xxx, um die globale SESSION-Variable zu registrieren. Die Verwendungsmethoden von GET, POST und COOKIE sind ähnlich.
Hinweis: session_register(), session_unregister, session_is_registered werden unter PHP5 nicht mehr verwendet, es sei denn, register_globle ist in php.ini aktiviert. Aus Sicherheitsgründen wird jedoch dringend empfohlen, register_globle zu deaktivieren. Die Verwendung von HTTP_SESSION_VARS wird nicht mehr empfohlen und die offizielle Empfehlung lautet stattdessen $_SESSION. Zum Beispiel:

Seite1.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.

  ?>

Seite2.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;;
  ?>

Es gibt zwei Möglichkeiten, eine Sitzungs-ID zu übergeben:

  1. Cookie

  2. URL-Parameter

Das Sitzungsmodul unterstützt beide Methoden. Cookies sind optimierter, aber da sie nicht immer verfügbar sind, werden auch Alternativen bereitgestellt. Bei der zweiten Methode wird die Sitzungs-ID direkt in die Mitte der URL eingebettet.

PHP kann Verbindungen transparent konvertieren. Sofern Sie PHP 4.2 oder neuer nicht verwenden, müssen Sie es beim Kompilieren von PHP manuell aktivieren. Verwenden Sie unter Unix die Konfigurationsoption --enable-trans-sid. Wenn diese Konfigurationsoption und die Laufzeitoption session.use_trans_sid beide aktiviert sind (php.ini ändern), wird der relative URI automatisch so geändert, dass er die Sitzungs-ID enthält.

session_id
session_id() wird verwendet, um die aktuelle session_id festzulegen oder abzurufen. In PHP5 können Sie entweder session_id() verwenden oder die session_id und den session_name der aktuellen Sitzung über die an die URL angehängte SID abrufen.
Wenn session_id() einen bestimmten Wert hat, ersetzt er den aktuellen session_id-Wert. Die Sitzung muss gestartet werden, bevor diese Funktion verwendet wird: session_start();
Wenn wir Sitzungscookies verwenden und ein session_id()-Wert angegeben wird, wird bei jedem Start von session_start() ein Cookie-Wert an den Client gesendet. Unabhängig davon, ob die aktuelle session_id dem angegebenen Wert entspricht.
session_id() gibt die aktuelle session_id() zurück, wenn kein Wert angegeben ist; wenn die aktuelle Sitzung nicht gestartet ist, wird eine leere Zeichenfolge zurückgegeben.

Überprüfen Sie, ob die Sitzung existiert?
In früheren PHP-Versionen wurde session_is_register() normalerweise verwendet, um zu überprüfen, ob die Sitzung existiert. Wenn Sie $_SESSION['XXX']=XXX verwenden, um Sitzungsvariablen zu registrieren, funktioniert die Funktion session_is_register() nicht mehr. Sie können stattdessen
isset($_SESSION['xxx']) verwenden.

Change session_id session_regenerate_id() gibt true zurück, wenn die Änderung erfolgreich ist, und false, wenn sie fehlschlägt.
Mit dieser Funktion kann die Sitzungs-ID für die aktuelle Sitzung geändert werden, andere Informationen der aktuellen Sitzung werden jedoch nicht geändert. Zum Beispiel:

  <?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操作类(附源码)

 

Das obige ist der detaillierte Inhalt vonPHP-Methode, um zu verhindern, dass die Sitzung abläuft. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn