|
ñAphp3,4sessionI实现
Ýphp3¥vLsession这种东东ICAä们ùvC么办呢H别}CLkœlÖ你ô¹这±C这ŽÅLŒIvZphplib¹B你ÂÈOº载CÂÈãàåªphpâ_º载Bä们vôIæê¥让phplibaphp3结ÝêNg\HìB为¹\实现这ûÊI÷\Cä们ùvæÀphplibBæî
äôCkeÕI(Ⱥû@Ýwin2000+php3.0.16+apache1.3.12+phplib7.2c+mysql3.23.21
for win32 ãÊ过)phplibÅî{I÷\ïp户认证CSessionÇC权Ày库IÛ»B
样gpphplib实现session÷\呢?
êAñæ你«phplibð开C¢ÊLê¢Ú录©"php",«这¢Ú录贝apacheIÀÚ录ºBÈ笔ÒI÷í为á:äIapacheÀÝd:/apacheÚ录º,ä«ãÊI"php"Ú录贝d:a/pache,ó«phplibºIpages
Ú录ºI¶aÚ录êN贝
d:/apache/htdocsºCÓs带Ú录{gBphplibI类库ùvªn统进sn»C你ÂÈCülocal.inc¶CŽïÜ
ê±î{QC你ÂȪ©È÷íI实际îv进sCüB
«d:/apache/php/prepend.php3¶Iêiöü为@º样qF
if (!isset($_PHPLIB) or !is_array($_PHPLIB)) {
$_PHPLIB["libdir"] = "d:/apache/php/"; //这Xü为你úphplibºphpÚ录IHa }
R@«d:/apache/php/local.inc¶ü@º:
class DB_Example extends DB_Sql { var $Host =
"localhost";//你Imysql库Ýå÷Œ var $Database =
"test";//库Œ var $User = "root";//库p户Œ var
$Password = "";//库p户ûß }
Å@ê步执sð开IphplibÚ录IstuffÚ录ºIcreate_database.mysql¶,¶¬n\Bä们说ŸêºphplibIHìŽC每ê¢gpphplibI页ÊñæK须ÂÈQ运sphplibK须类库¶Cä们ÂÈÝphp3.ini设uauto_prepend变ÊxCphplibª发ïïÜê¢prepend.php3¶C«auto_prependwè"d:/apache/php/prepend.php3"(带ø)@Ce页ÊAï©动ïÜphplib类库Cä们还ÂÈ«phplib类库ÝÚ录Á进include变ÊCÈÖÂÈQ这±¶CRCÅ苯I办@A¥wèphplibI绝对HaC这Âs¥¢DåÓ,ÂÚA«Ÿ·I
æñ步C每ê¢gpphplibI页ÊC你K须ñæ调ppage_open进sn»B这ï诉phplibC你现Ýœ«ïpó态Û¶Bê¢T^I
page_openáq@ºF
<?php
page_open(array("sess" => "Example_Session")); ?>
组变Ê(sess)pn»ê±ó态Û¶对ÛCÓFK须gpphplibàuŒ(sess)C这±àuŒ¥你Ýlocal.iniè义ICpage_openK须Ý页Êàe输o浏览íVOí调pBphp3r{Å@应Èpage_close()结©C这«ï«L关ó态Êñ库C@Ê你Y¹I话C结Ê你应该\z,ûûC你I变ÊS丢¹,Âsvöäv诉你...
ö为phplibgp¹CookiesÛ¶ó态M§CÈpage_open()K须Ý页Êàe输o浏览íVOí调pC
这¢I页ÊàeÂÈ¥CœHTMLM§œÒósC@Ê你发现¹错误"Oops - SetCookie called after header has been
sent"C这\ŸÝpage_open()VOü浏览í输o¹±Y么C你vÁ别¯ÓósCö为ñí难QCT^I错误¥Ý<? a ?
>标记V间输o¹ósC你应检查Ýlocal.incaprepend.php3¶¥ÛïܹósC这ç¥ê¢ñíeÕo错InûB为¹减o错IÂ\,ä们ÂÈ这样书Ên»ö:
<? page_open(array("sess" => "Example_Session"));
?> <html> ..... </html>
æO步CïÌgpB
ê¢p户访问¹该ã€â@CŠp户IsessionA开n¹C@Êp户I浏览íxcookieI话C«ï§ê¢sessionIidúücookieC这¢BêIID¥RPHP3÷¶¬CR@p÷种qø进smd5Á§过¹IC这¢Icookie应该©ôsession
cookieCö为这¢cookie¥sïÊp户d盘¢ICê¢sessionú结©I时óC该cookieçí®结¹B@Êp户浏览ísxcookieI话Cß么
该sessionIid«ïúüurl链Cö为¥Á§过ICÈÞæ¹çvpBsession
ID¶ú
p户IL关M§C@p户ß认证A认证ú时间Ap户权ÀCaŽŒê±你Â\ùvIM§CûÖä们æpBSessionŽ实A¥p户êï话I过öBSessionós¥仅仅pæîçHp户IeC实际ãC还ÂÈLŽIgp场C你ÂÈp¶储Cœ你zv¶贮IM§C这±M§ÂÈÝp户@访问I页Êhãp场CROñ¥ß±页ÊvgpPHPLIBBû@k简单Ceê¢变Ê@ŠÂÝ@I页ÊgpCŒsession结©Bû@F
<?php
$sess->register( "variable_name"); ?>
ÓC这¢Ivariable_names¥变Ê值C§¥变ÊŒCÂÈæwè变ÊŒC@Ä赋值B你Ý^¢页ÊÂÈü变变ÊI值C@I页Ê访问该变ÊïŸü变@I值B变ÊI类^¥œ样ICÂÈ¥ê¢øCê¢Cê¢组B举á说ŸF
æê页: <?php
page_open(array("sess" => "Example_Session"));
$sess->register( "first"); //Ó变ÊŒOsùvÁ$ if (iset($firstname))
{ $first = $firstname; } .....
page_close(); ?>
æñ页: <?php
page_open();//开nsession
echo $first;//ÅÅÁÊ
page_close();//Û¶ó态M§ ?>
e®ê¢变ÊC页ÊÅ@调ppage_close()@Ce¢session变ÊïíÊñ库B@Ê你Y记调ppage_close()I话C变ÊAsïíÊñ库C«o现sÂ预mI@ÊB变Êígp®毕C你sÄùvp时CÂÈ调pȺ«变Ê删F
<?php
page_open(array("sess" => "Example_Session")); ...
$sess->unregister( "variable_name"); ...
page_close(); ?>
PHPLIB
7.0Cgp¹ê种¶储结构Cò许你¶储session库A€à¶œÒLDAPBPHPLIBgp¹库类C这gŸ你L¹XœI选择,你ÂÈ选poracle8,mysql,postgresql库Û¶ó态M§B
关°phplibIŽ÷\ÈyL关sessionIŽIgpC你ÂÈQÅ带Ièe,œãIã€âÅÝ线¶BIVÆÝhttp://phplib.netuse.de/index.php3
Bphp4Isession实现åsžphplibwICçèÏcookiesÛ¶session
id,p¶n统Û¶变Ê(àÒ认îvº)BöCIsession变Ês\Û¶对Û(实ã\Û¶对ÛàeCAvLÓ义Cö为¥Û¶Ý¥盘ãICs¥I对ÛC[ŽÊçA¥对ÛÌB)s过这_IÀ§s¥ŸåCä们ÝåªîvºsüùvÛ¶变ÊAs¹BR你çÂÈ«sessionÛ¶Ý库,ºê¬节ä们ï讲样«sessionÛ¶Ý库BÝphp4R°äphp3œ¹sessionxCÈÝphp.ini¶çœ¹sessionzu选项BºÊä们ÅÅe项Iìp^Ó义:
[Session] session.save_handler = files ; handler used to
store/retrieve data(pY么Û¶session变Ê,àÒ认îvºp¶) session.save_path =
c:/temp ; argument passed to
save_handler(Û¶session变ÊIÚ录CÝlinux/unixº为/tmp,Ýwinº设为你IÚ录) ; in the
case of files, this is the ; path where data files are stored
session.use_cookies =
1 ; whether to use cookies(¥Ûgpcookies,RCÝwinº别Ù选择) session.name =
PHPSESSID ; name of the session(àÒ认sessiongpIcookiesŒ,议svü动)
; is used as cookie name session.auto_start = 0 ; initialize
session on request
startup(¥Û©动启psession,为1时CÝ每页AÂÈsK调psession_start()¹)
session.cookie_lifetime = 0 ; lifetime in seconds of cookie(设è cookie
浏览í@IÛ¶时间C单Ê为bBãÈ值为 0C\ŠŒ浏览í关闭B) ; or if 0, until browser is
restarted session.cookie_path = / ; the path the cookie is valid
for(cookie)(cookiesLÁHa) session.cookie_domain = ; the domain the
cookie is valid for(cookiesLÁæŒ) session.serialize_handler = php ; handler used to
serialize data(è义ñ»I标识C{÷\üL WDDX Í块œ PHP àgpBãÈ值为 php) ; php is the standard
serializer of PHP
session.gc_probability = 1 ; percentual probability that the (设è每临时¶开n处
(gc, garbage collection) 处TŠBãÈ值为 1B ) ; 'garbage collection' process
is started ; on every session initialization
session.gc_maxlifetime = 1440 ; after this number of seconds,
stored(设èÛ¶sessionI临时¶íŽOI¶b) ; data will be seen as 'garbage'
and ; cleaned up by the gc process session.referer_check = ;
check HTTP Referer to invalidate (rèQÆq户[ISession
ã码¥Ûv删BL时ÝÀSœŽl虑时Cï设ès删BãÈ值为 0B) ; externally stored URLs
containing ids session.entropy_length = 0 ; how many bytes to read
from the file(设è session ž熵值资¹读æIÊBãÈ值为 0.) session.entropy_file = ;
specified here to create the session id(设è session ã码§时CgpO熵值资¹œ¶§Cá@ UNIX
n统ãI /dev/random œ /dev/urandomB ) ; session.entropy_length =
16 ; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; set to { nocache,private,public } to
(设èsession缓tÀ§) ; determine HTTP caching aspects
session.cache_expire = 180 ; document expires after n
minutes(¶LÁú,单Ê为ª钟)
ÝwindowsœäºCphp4.01pl2ÈOIÅ{ïo现设usession.save_path @o错IîvC这¥phpIê¢bug,Ýphp4.01pl2yÈ@ß经C³¹B@Ê你pÈOIÅ{C你ÂÈ«session.save_path设为"./",œ设为"/temp",óÝ你úuphpr{IO盘ªÚ录ºê¢Œ为tempIÚ录ŠÂ(äIphpr{úÝd:apachehtdocsºC则äÝd:盘ªÚ录ºêŒ为tempIÚ录)B
Ýphp4L关sessionIåvLȺ这±F
session_start: n»session,ùvpsessionI每ê¢页ÊÅ开n处调pB session_destroy:
结© session,Ýùv结©session处调B session_name: ¶æÚO session ŒÌB
session_module_name: ¶æÚO session Í块B session_save_path: ¶æÚO
session HaB session_id: ¶æÚO session idB session_register:
eVIsession变ÊB session_unregister: 删ßesession变ÊB
session_is_registered: 检查session变Ê¥ÛeB session_decode: Session
ð码B session_encode: Session Á§B
Êíîvºä们üùv调pO¢ŠÂB
Šsesssion_start()Asession_register()Asession_is_registered()B
ÝùvpsessionI每ê页IÅ开n处调psession_start()C
ê¢T^IgpsessionI页Ê@ºF <?session_start()?>
<html> .... <body> <?
$var="hello"; session_register("var");//e$var变ÊCÓvL$
if(session_is_registered("var"))//检查变Ê¥Ûe echo
"haha,e¹!"; else echo "sorry,还vLe!";
?> </body> </html>
php4session处Iè§
ä们ùv扩[6¢CR这±sù你调pC对ä们说¥§ŸIB
这{¢¥: sess_open($sess_path, $session_name);
这¢ísession处ö调pìn»HìBùv传给I两¢Q¥$sess_path,对应你Iphp.ini¶Isession.save_path选项;$session_name,对应php.iniIsession.name
选项B们ïÌ样Hì,请źÊIáqB
sess_close();
这¢Ý页Ê结©执sósession处öùv关闭时í调pB(ÓCsvasess_destory¬À¹,¥p结©sessionI)
sess_read($key);
这¢Ýsession处ö读æwèsession键值($key)时B
这¢检õóÔñ标识为$keyIsession.(ÓF你spSS样ñ»aœñ»,@Ê你sm¹这¥Y么ÓvCsvSS)
译ÒFñ»¥«变Êœ对ÛÝö结©œùv时۶ݶCݺö运sœùv时Ä 调üà¶IZ术,L别°üÛ¶Iû@B
sess_write($key, $val);
这¢Ýsession处öùv«Û¶时调p,这种îv经íÝ你Iö结©时发¶B负责«Û¶Ýº\psess_read($key)检õInûB
sess_destroy($key);
这¢ÝùvÁ毁session时B负责删sessionóŽ环«B
sess_gc($maxlifetime);
这¢负责ŽáêÐBÝ这种îvºC负责删过时IsessionBsession处öïô尔调p们B
现Ýä们ß经Ž^¹ä们ñIB
è§öÂÈpmysql库œDBM¶Û¶sessionBær°你IùvB
@Ê你règpmysqlìxCßùvìȺHì:
ñæä们Ýmysql创ê¢sessions库Có创ê¢sessions\Bæ运s你Imysqlq户[ó执sºÊIœßF
mysql> CREATE DATABASE sessions;
mysql> GRANT select, insert, update, dele ON sessions.* TO phpsession@localhost ->
IDENTIFIED BY 'phpsession';
mysql> CREATE TABLE sessions ( -> sesskey char(32) not
null, -> expiry int(11) unsigned not null, -> value
text not null, -> PRIMARY KEY (sesskey) -> );
ºê步,Cüsession_mysql.php¶I$SESS_DB*
变ÊgŽCz你÷íãI库设uB
(kø]CR°Å权ŽöCäs\cȺã码Ip¶{CüDÁ±释¹
==================================================================================
<? /*
------------------------------------------------------------------------
* session_mysql.php *
------------------------------------------------------------------------
* PHP4 MySQL Session Handler * Version 1.00 * by Ying
Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000 * *
------------------------------------------------------------------------
* TERMS OF USAGE: *
------------------------------------------------------------------------
* You are free to use this library in any way you want, no warranties
are * expressed or implied. This works for me, but I don't guarantee
that it * works for you, USE AT YOUR OWN RISK. * *
While not required to do so, I would appreciate it if you would retain
* this header information. If you make any modifications or
improvements, * please send them via email to Ying Zhang <ying@zippydesign.com>.
* *
------------------------------------------------------------------------
* DESCRIPTION: *
------------------------------------------------------------------------
* This library tells the PHP4 session handler to write to a MySQL
database * instead of creating individual files for each
session. * * Create a new database in MySQL called
"sessions" like so: * * CREATE TABLE sessions ( *
sesskey char(32) not null, * expiry int(11) unsigned not null,
* value text not null, * PRIMARY KEY (sesskey) *
); * *
------------------------------------------------------------------------
* INSTALLATION: *
------------------------------------------------------------------------
* Make sure you have MySQL support compiled into PHP4. Then copy this
* script to a directory that is accessible by the rest of your PHP *
scripts. * 确M你Iphp4LmysqlxCR@c这¢r{贝a你Iphpr{L关IÚ录B *
------------------------------------------------------------------------
* USAGE:igpû@j *
------------------------------------------------------------------------
* Include this file in your scripts before you call session_start(),
you * don't have to do anything special after that. *
ïÜ这¢¶你vgpsessionI¶CK须Ý调psession_start()VOCÛ则, * ïkSICsvöäv诉你B
这样AsùvÄôY么Hì¹,还a你ÈOpsessionIû@ê样B */
$SESS_DBHOST = "localhost"; /* database server hostname */
$SESS_DBNAME = "sessions"; /* database name */ $SESS_DBUSER =
"phpsession"; /* database user */ $SESS_DBPASS = "phpsession"; /*
database password */
$SESS_DBH = ""; $SESS_LIFE =
get_cfg_var("session.gc_maxlifetime");
function sess_open($save_path, $session_name) { global
$SESS_DBHOST, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS, $SESS_DBH;
if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST, $SESS_DBUSER, $SESS_DBPASS))
{ echo "<li>Can't connect to $SESS_DBHOST as
$SESS_DBUSER"; echo "<li>MySQL Error: ", mysql_error();
die; }
if (! mysql_select_db($SESS_DBNAME, $SESS_DBH)) { echo
"<li>Unable to select database $SESS_DBNAME"; die;
}
return true; }
function sess_close() { return true; }
function sess_read($key) { global $SESS_DBH, $SESS_LIFE;
$qry = "SELECT value FROM sessions WHERE sesskey = '$key' AND expiry > " .
time(); $qid = mysql_query($qry, $SESS_DBH);
if (list($value) = mysql_fetch_row($qid)) { return $value;
}
return false; }
function sess_write($key, $val) { global $SESS_DBH,
$SESS_LIFE;
$expiry = time() + $SESS_LIFE; $value = addslashes($val);
$qry = "INSERT INTO sessions VALUES ('$key', $expiry, '$value')";
$qid = mysql_query($qry, $SESS_DBH);
if (! $qid) { $qry = "UPDATE sessions SET expiry = $expiry, value =
'$value' WHERE sesskey = '$key' AND expiry > " . time();
$qid = mysql_query($qry, $SESS_DBH); }
return $qid; }
function sess_destroy($key) { global $SESS_DBH;
$qry = "DELETE FROM sessions WHERE sesskey = '$key'"; $qid =
mysql_query($qry, $SESS_DBH);
return $qid; }
function sess_gc($maxlifetime) { global $SESS_DBH;
$qry = "DELETE FROM sessions WHERE expiry < " . time(); $qid =
mysql_query($qry, $SESS_DBH);
return mysql_affected_rows($SESS_DBH); }
session_set_save_handler( "sess_open",
"sess_close", "sess_read", "sess_write",
"sess_destroy", "sess_gc"); ?>
=================================================================
è§gpdbm¶时IÚû
=================================================================
<? /*
------------------------------------------------------------------------
* session_dbm.php *
------------------------------------------------------------------------
* PHP4 DBM Session Handler * Version 1.00 * by Ying
Zhang (ying@zippydesign.com)
* Last Modified: May 21 2000 * *
------------------------------------------------------------------------
* TERMS OF USAGE: *
------------------------------------------------------------------------
* You are free to use this library in any way you want, no warranties
are * expressed or implied. This works for me, but I don't guarantee
that it * works for you, USE AT YOUR OWN RISK. * *
While not required to do so, I would appreciate it if you would retain
* this header information. If you make any modifications or
improvements, * please send them via email to Ying Zhang <ying@zippydesign.com>.
* *
------------------------------------------------------------------------
* DESCRIPTION: *
------------------------------------------------------------------------
* This library tells the PHP4 session handler to write to a DBM file
* instead of creating individual files for each session. *
*
------------------------------------------------------------------------
* INSTALLATION: *
------------------------------------------------------------------------
* Make sure you have DBM support compiled into PHP4. Then copy this
* script to a directory that is accessible by the rest of your PHP *
scripts. * 确M你Iphp4LDBMxB贝这¢¶Ý你Iphpr{Ú录B *
------------------------------------------------------------------------
* USAGE: *
------------------------------------------------------------------------
* Include this file in your scripts before you call session_start(),
you * don't have to do anything special after that. *
Ý调psession_start()VO请ïÜ这¢¶BV@AsùvìY么Hì¹B */
$SESS_DBM = ""; $SESS_LIFE =
get_cfg_var("session.gc_maxlifetime");
function sess_open($save_path, $session_name) { global
$SESS_DBM;
$SESS_DBM = dbmopen("$save_path/$session_name", "c"); return
($SESS_DBM); }
function sess_close() { global $SESS_DBM;
dbmclose($SESS_DBM); return true; }
function sess_read($key) { global $SESS_DBM, $SESS_LIFE;
$var = ""; if ($tmp = dbmfetch($SESS_DBM, $key)) {
$expires_at = substr($tmp, 0, strpos($tmp, " "));
if ($expires_at > time()) { $var = substr($tmp, strpos($tmp,
" ") + 1); } }
return $var; }
function sess_write($key, $val) { global $SESS_DBM,
$SESS_LIFE;
dbmreplace($SESS_DBM, $key, time() + $SESS_LIFE . " " . $val);
return true; }
function sess_destroy($key) { global $SESS_DBM;
dbmdele($SESS_DBM, $key); return true; }
function sess_gc($maxlifetime) { global $SESS_DBM;
$now = time(); $key = dbmfirstkey($SESS_DBM); while
($key) { if ($tmp = dbmfetch($SESS_DBM, $key)) { $expires_at
= substr($tmp, 0, strpos($tmp, " ")); if ($now > $expires_at)
{ sess_destroy($key); } }
$key = dbmnextkey($SESS_DBM, $key); } }
session_set_save_handler( "sess_open",
"sess_close", "sess_read", "sess_write",
"sess_destroy", "sess_gc"); ?>
=================================================================
ïÌ么pAspœ说¹Cö为这±s¥phpøúÌ调pIC^ä们Ù关IBä们üùÆãqz
u@As¹C你pI还¥ÈOIsessionB ÅźÊIã码Am¹¹Fj
sessionè§I测试ã码
==================================================================
<? /*
------------------------------------------------------------------------
* test.php
*
------------------------------------------------------------------------
* PHP4 Customer Session Handler Test Script * Version 1.00
* by Ying Zhang (ying@zippydesign.com) * Last
Modified: May 21 2000 */
/* default to DBM handler */ if (! isset($handler)) {
$handler = "dbm"; }
/* default action is increment */ if (! isset($action)) {
$action = "increment"; }
/* load up the appropriate session handling script, depending on the handler
*/ if ($handler == "dbm") { include("session_dbm.php");
} elseif ($handler == "mysql") { include("session_mysql.php");
} else { echo "<li>Unrecognized handler ($handler)";
die; }
/* start the session and register a simple counter */
session_start(); session_register("count");
/* figure out what we should do, depending on the action */ switch
($action) { case "increment" : $count = isset($count) ?
$count + 1 : 0; break;
case "destroy" : session_destroy(); break;
case "gc" : $maxlife = get_cfg_var("session.gc_maxlifetime");
sess_gc($maxlife); break;
default: echo "<li>Unknown action ($action)";
break; } ?>
<h1>Session Test Script</h1> <ul>
<li>Handler: <b><?=$handler?></b>
<li>Action: <b><?=$action?></b>
<li>Count: <b><?=$count?></b>
</ul>
<hr size=1> <form> <table>
<tr> <td>Handler:</td>
<td> <select name="handler"> <option
value="dbm">DBM</option> <option
value="mysql">MySQL</option> </select>
</td> </tr> <tr>
<td>Action:</td> <td> <select
name="action"> <option
value="increment">Increment</option> <option
value="destroy">Session Destroy</option> <option
value="gc">Force Garbage Collection</option>
</select> </td> </tr>
<tr> <td></td>
<td><br><input type="submit"></td>
</tr> </table> </form> |