《PHP實(shí)戰(zhàn):關(guān)于PHP中Session文件過多的問題及session文件保存位置》要點(diǎn):
本文介紹了PHP實(shí)戰(zhàn):關(guān)于PHP中Session文件過多的問題及session文件保存位置,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP編程PHP的默認(rèn)機(jī)制:每一次php哀求,會(huì)有1/100的概率(默認(rèn)值)觸發(fā)“session回收”.如果“session回收”發(fā)生,那就會(huì)檢查/tmp/sess_*的文件,如果最后的修改時(shí)間到現(xiàn)在超過了1440秒(gc_maxlifetime的值),就將其刪除,意味著這些session過期失效
PHP編程一、session文件是什么
PHP編程文件一般為 /tmp/sessions/sess_4b1e384ad74619bd212e236e52a5a174If
PHP編程username|s:9:"test";admin|s:1:"0";
PHP編程二、session回收何時(shí)發(fā)生
PHP編程默認(rèn)情況下,每一次php哀求,就會(huì)有1/100的概率發(fā)生回收,所以可能簡(jiǎn)單的理解為“每100次php哀求就有一次回收發(fā)生”.這個(gè)概率是通過以下參數(shù)控制的
PHP編程
#概率是gc_probability/gc_divisor
session.gc_probability = 1
session.gc_divisor = 100
PHP編程假設(shè)這種情況gc_maxlifetime=120,如果某個(gè)session文件最后修改時(shí)間是120秒之前,那么在下一次回收(1/100的概率)發(fā)生前,這個(gè)session仍然是有效的.
PHP編程如果你的session使用session.save_path中使用別的地方保留session,session回收機(jī)制有可能不會(huì)自動(dòng)處理過期session文件.這時(shí)需要定時(shí)手動(dòng)(或者crontab)的刪除過期的session
PHP編程三、設(shè)置session存儲(chǔ)目錄
PHP編程使用php5-fpm的話, 修改/etc/php5/fpm/php.ini, 修改或添加下面一行:
PHP編程
session.save_path = 3;600:/tmp/sessions
PHP編程四、session清除腳本
PHP編程
#!/bin/sh
find /tmp/php-session -cmin +24 -name "sess_*" -and -size 0 -delete > /dev/null 2>&1
find /tmp/php-session -cmin +1440 -name "sess_*" -delete > /dev/null 2>&1
PHP編程這里的時(shí)間我們可以通過 session.gc_maxlifetime 來獲取,放到定時(shí)任務(wù)里面即可(crontab)
PHP編程其他方式
PHP編程使用memcache 等 ,(session.save_handler = memcache)
PHP編程使用cookie,但是cookie得加密
PHP編程五、使用tmfs存儲(chǔ)session
PHP編程1、將/tmp掛載為 tmpfs文件系統(tǒng)
PHP編程修改/etc/fstab,在最后一行添加如下內(nèi)容:/tmp/sessions tmpfs defaults,size=5120m 0 0
PHP編程
mount -a
PHP編程2、創(chuàng)建session存儲(chǔ)文件夾
PHP編程php并不會(huì)自動(dòng)去創(chuàng)建這些文件夾,不過在源文件中提供了一些創(chuàng)建文件夾的腳本.下面這個(gè)腳本也好用,腳本內(nèi)容如下
PHP編程
#!/bin/sh
dir="0 1 2 3 4 5 6 7 8 9 a b c d e f"
for levela in $dir;
do
for levelb in $dir;
do
for levelc in $dir;
do
mkdir -p /tmp/sessions/$levela/$levelb/$levelc;
done
done;
done
chown -R root:webgrp /tmp/sessions && chmod -R 1777 /tmp/sessions
PHP編程因?yàn)?tmp/sessions是用的內(nèi)存,服務(wù)器重啟后,里面的所有文件都會(huì)丟失,所以,需要把上面的腳本加入到 /etc/rc.local中,并且要放在啟動(dòng)php之前
PHP編程3、將session存儲(chǔ)到不同的目錄中
PHP編程php本身支持session的多級(jí)散列,在php.ini中,將 ;session.save_path = /tmp 改為
PHP編程
session.save_path = "3;/tmp/sessions
PHP編程4、session的回收
PHP編程使用上面的腳本即可
PHP編程下面給大家說下php session 數(shù)據(jù)保留在哪里?
PHP編程當(dāng)然是在服務(wù)器端,但不是保留在內(nèi)存中,而是保留在文件或數(shù)據(jù)庫中.
PHP編程默認(rèn)情況下,php.ini 中設(shè)置的 SESSION 保留方式是 files(session.save_handler = files),即使用讀寫文件的方式保留 SESSION 數(shù)據(jù),而 SESSION 文件保留的目錄由 session.save_path 指定,文件名以 sess_ 為前綴,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b.文件中的數(shù)據(jù)即是序列化之后的 SESSION 數(shù)據(jù)了.
PHP編程如果拜訪量大,可能產(chǎn)生的 SESSION 文件會(huì)比較多,這時(shí)可以設(shè)置分級(jí)目錄進(jìn)行 SESSION 文件的保存,效率會(huì)提高很多,設(shè)置方法為:session.save_path="N;/save_path",N 為分級(jí)的級(jí)數(shù),save_path 為開始目錄.
PHP編程當(dāng)寫入 SESSION 數(shù)據(jù)的時(shí)候,PHP 會(huì)獲取到客戶端的 SESSION_ID,然后根據(jù)這個(gè) SESSION ID 到指定的 SESSION 文件保留目錄中找到相應(yīng)的 SESSION 文件,不存在則創(chuàng)建之,最后將數(shù)據(jù)序列化之后寫入文件.讀取 SESSION 數(shù)據(jù)是也是類似的操作流程,對(duì)讀出來的數(shù)據(jù)需要進(jìn)行解序列化,生成相應(yīng)的 SESSION 變量.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《PHP實(shí)戰(zhàn):關(guān)于PHP中Session文件過多的問題及session文件保存位置》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/7335.html