当前位置: 编程技术>php
本页文章导读:
▪php4的session功能评述(三)
总的感觉php的session功能基本上还能用一用,还算方便,省了很多自己处理 cookie的麻烦事情。php的session管理还是基于文件的,默认的是在/tmp目录 下生成一个和session id同名的session文件.........
▪php4的session功能评述(一)
php4比php3新加了session的支持。稍微用了一下,对其函数接口,内部机制, 应用的方便性做了大概的了解。 session的意义大家都应该清楚,一个session可以包括数次http的请求和应答, 比.........
▪php4的session功能评述(二)
比较模糊的是session_decode和session_encode: bool session_decode(string data); session_decode() decodes the session data in data, setting variables stored in the session. bool session_encode(void); session_encode() returns a s.........
[1]php4的session功能评述(三)
来源: 互联网 发布时间: 2013-11-30
总的感觉php的session功能基本上还能用一用,还算方便,省了很多自己处理
cookie的麻烦事情。php的session管理还是基于文件的,默认的是在/tmp目录
下生成一个和session id同名的session文件,在这个文件里保存register的
session data。session有生存期,在/usr/local/lib/php.ini里可以设置。
效率应该算马马虎虎了,毕竟还是要文件操作,虽然是/tmp的。对于服务量很
大的应用会在/tmp里生成很多session文件,分特。。。
对于分布式应用呢?几台web server一起服务?招倒是有,session文件的目录
是可配置的,把所有的session文件搞到一个共享的nfs目录就完事了。但是php
生成唯一文件的时候有没有考虑过nfs的特殊处理?我没仔细去看源码,估计会
出问题,虽然几率很小...
倒是可以做个session keeper的damon,session数据可以通过hash表的方式存
贮在内存里,以udp服务方式(效率高,lan里面包丢失率小)完成session的生
成,检索,结束,取置session变量等操作,这样多台web server可以共享
session信息。服务端和客户端的函数我都做了,现在问题是怎样把客户端的函
数加到php里面,或者php对动态库函数调用的支持怎么样,这些东西manual里
面都很不详尽,没有相关的例子。
BTW:由于语法的不严格,php的函数返回容易造成二义性,比如strpos,没有
匹配返回0,但是匹配的position可能是0的,faint~...
cookie的麻烦事情。php的session管理还是基于文件的,默认的是在/tmp目录
下生成一个和session id同名的session文件,在这个文件里保存register的
session data。session有生存期,在/usr/local/lib/php.ini里可以设置。
效率应该算马马虎虎了,毕竟还是要文件操作,虽然是/tmp的。对于服务量很
大的应用会在/tmp里生成很多session文件,分特。。。
对于分布式应用呢?几台web server一起服务?招倒是有,session文件的目录
是可配置的,把所有的session文件搞到一个共享的nfs目录就完事了。但是php
生成唯一文件的时候有没有考虑过nfs的特殊处理?我没仔细去看源码,估计会
出问题,虽然几率很小...
倒是可以做个session keeper的damon,session数据可以通过hash表的方式存
贮在内存里,以udp服务方式(效率高,lan里面包丢失率小)完成session的生
成,检索,结束,取置session变量等操作,这样多台web server可以共享
session信息。服务端和客户端的函数我都做了,现在问题是怎样把客户端的函
数加到php里面,或者php对动态库函数调用的支持怎么样,这些东西manual里
面都很不详尽,没有相关的例子。
BTW:由于语法的不严格,php的函数返回容易造成二义性,比如strpos,没有
匹配返回0,但是匹配的position可能是0的,faint~...
[2]php4的session功能评述(一)
来源: 互联网 发布时间: 2013-11-30
php4比php3新加了session的支持。稍微用了一下,对其函数接口,内部机制,
应用的方便性做了大概的了解。
session的意义大家都应该清楚,一个session可以包括数次http的请求和应答,
比如我们用163.net,从login到logout或者超时就作为一个session,session
的唯一标识一般是在系统内部生成一个唯一的session ID,一般是一个挺长的
字符串。一个session除了session ID,还可以有自己的session data,可以
记录和区分sesion的不同状态。
php4对session操作提供以下接口:
session_start — Initialize session data
session_destroy — Destroys all data registered to a session
session_name — Get and/or set the current session name
session_module_name — Get and/or set the current session module
session_save_path — Get and/or set the current session save path
session_id — Get and/or set the current session id
session_register — Register a variable with the current session
session_unregister — Unregister a variable from the current session
session_is_registered — Find out if a variable is registered in a session
session_decode — Decodes session data from a string
session_encode — Encodes the current session data as a string
意义大家一看就能明白,session_start开始一个session,session_destroy结
束一个session,session_id取得当前的session_id,session_register向当前
的session注册一个变量,这个很有用,比如用户逛商场,选中了某几样商品你
就可以用session_register把商品名称或者代码register到当前的session中。
比如下面例子(摘自php manual):
<?php
session_register("count");
$count++;
?>
Hello visitor, you have seen this page <? echo $count; ?> times.<p>
# the <?=SID?> is necessary to preserve the session id
# in the case that the user has disabled cookies
To continue, <A HREF="/blog_article/nextpage/lt;/SID/gt;.html">click here</A>
session_register可以隐式地激发session_start(如果用户之前没发session_
start调用),当前的session注册了一个变量count,每次用户点击click here
的时候,这个变量都会增一。你可以自己试一下。<?=SID?>的意义不多赘述。
应用的方便性做了大概的了解。
session的意义大家都应该清楚,一个session可以包括数次http的请求和应答,
比如我们用163.net,从login到logout或者超时就作为一个session,session
的唯一标识一般是在系统内部生成一个唯一的session ID,一般是一个挺长的
字符串。一个session除了session ID,还可以有自己的session data,可以
记录和区分sesion的不同状态。
php4对session操作提供以下接口:
session_start — Initialize session data
session_destroy — Destroys all data registered to a session
session_name — Get and/or set the current session name
session_module_name — Get and/or set the current session module
session_save_path — Get and/or set the current session save path
session_id — Get and/or set the current session id
session_register — Register a variable with the current session
session_unregister — Unregister a variable from the current session
session_is_registered — Find out if a variable is registered in a session
session_decode — Decodes session data from a string
session_encode — Encodes the current session data as a string
意义大家一看就能明白,session_start开始一个session,session_destroy结
束一个session,session_id取得当前的session_id,session_register向当前
的session注册一个变量,这个很有用,比如用户逛商场,选中了某几样商品你
就可以用session_register把商品名称或者代码register到当前的session中。
比如下面例子(摘自php manual):
<?php
session_register("count");
$count++;
?>
Hello visitor, you have seen this page <? echo $count; ?> times.<p>
# the <?=SID?> is necessary to preserve the session id
# in the case that the user has disabled cookies
To continue, <A HREF="/blog_article/nextpage/lt;/SID/gt;.html">click here</A>
session_register可以隐式地激发session_start(如果用户之前没发session_
start调用),当前的session注册了一个变量count,每次用户点击click here
的时候,这个变量都会增一。你可以自己试一下。<?=SID?>的意义不多赘述。
[3]php4的session功能评述(二)
来源: 互联网 发布时间: 2013-11-30
比较模糊的是session_decode和session_encode:
bool session_decode(string data);
session_decode() decodes the session data in data, setting variables
stored in the session.
bool session_encode(void);
session_encode() returns a string with the contents of the current
sessionencoded within.
php manual里面好象没有相关的例子。从字面意思来看decode是把用户的串
解析出来以后set到session里面,encode则是把session的数据“打包”返回
给用户。这样看来encode的作用可能更大一些,用户register数据到session
里面以后应该是用encode把数据取出来的,但是encode返回的东西仍需要处理,
比如:
session_register("val1");
$val1 = "abcde"
session_register("val2");
$val1 = 1234
session_register("val3");
$val1 = 123.45
那么session_encode返回的东西是:
val1:s:5:"abcde";val2:i:1234;val3:d:123.45;
很明显,'s'是string,'i'和'd'是数字,'s'类型的变量需要长度。
如果你的session id是aaeebbcfd4455ec2c0d5cb590f8fab74,那么这串东西实际
上是存在/tmp/aaeebbcfd4455ec2c0d5cb590f8fab74文件当中。
现在需要你自己把这串东西做处理,析出你想要的session data。很奇怪php4
没提供一个方便的接口实现已register变量的解析... 或者有我没找着。
先自己写一个了...
session_data_init取出所有“打包”的session_data
session_data_get根据变量名取得数据
用:
$data = session_data_init( );
$result = session_data_get($data, "val1");
就可以把val1的数据取出来。
<?
/*
* get all date registered in the session
*/
function session_data_init( ) {
$sessionData = session_encode();
return $sessionData;
}
?>
<?
/*
* extract one variable from enconded session data
*/
function session_data_get($data, $name) {
$matchStr = $name."|";
$matchStart = strpos($data, $matchStr);
if ($matchStart == 0) {
if (strlen($data) < strlen($matchStr)) return "";
$tmpStr = substr($data, 0, strlen($matchStr));
if (strcmp($tmpStr, $matchStr) != 0) return "";
}
$typeStart = $matchStart + strlen($matchStr);
$dataType = substr($data, $typeStart, 1);
if (strcmp($dataType, "s") == 0) { /* string */
$lenStart = $typeStart + 2;
$lenEnd = strpos($data, ":", $lenStart) - 1;
$lenLen = $lenEnd - $lenStart + 1;
$strLen = substr($data, $lenStart, $lenLen);
$strStart = $lenEnd + 3;
$strResult = substr($data, $strStart, $strLen);
return $strResult;
} else if (strcmp($dataType, "i") == 0 ||
strcmp($dataType, "d") == 0) { /* number */
$numStart = $typeStart + 2;
$numEnd = strpos($data, ";", $numStart) - 1;
$numLen = numEnd - numStart + 1;
$numResult = substr($data, $numStart, $numLen);
return $numResult;
} else {
return "";
}
}
?>
bool session_decode(string data);
session_decode() decodes the session data in data, setting variables
stored in the session.
bool session_encode(void);
session_encode() returns a string with the contents of the current
sessionencoded within.
php manual里面好象没有相关的例子。从字面意思来看decode是把用户的串
解析出来以后set到session里面,encode则是把session的数据“打包”返回
给用户。这样看来encode的作用可能更大一些,用户register数据到session
里面以后应该是用encode把数据取出来的,但是encode返回的东西仍需要处理,
比如:
session_register("val1");
$val1 = "abcde"
session_register("val2");
$val1 = 1234
session_register("val3");
$val1 = 123.45
那么session_encode返回的东西是:
val1:s:5:"abcde";val2:i:1234;val3:d:123.45;
很明显,'s'是string,'i'和'd'是数字,'s'类型的变量需要长度。
如果你的session id是aaeebbcfd4455ec2c0d5cb590f8fab74,那么这串东西实际
上是存在/tmp/aaeebbcfd4455ec2c0d5cb590f8fab74文件当中。
现在需要你自己把这串东西做处理,析出你想要的session data。很奇怪php4
没提供一个方便的接口实现已register变量的解析... 或者有我没找着。
先自己写一个了...
session_data_init取出所有“打包”的session_data
session_data_get根据变量名取得数据
用:
$data = session_data_init( );
$result = session_data_get($data, "val1");
就可以把val1的数据取出来。
<?
/*
* get all date registered in the session
*/
function session_data_init( ) {
$sessionData = session_encode();
return $sessionData;
}
?>
<?
/*
* extract one variable from enconded session data
*/
function session_data_get($data, $name) {
$matchStr = $name."|";
$matchStart = strpos($data, $matchStr);
if ($matchStart == 0) {
if (strlen($data) < strlen($matchStr)) return "";
$tmpStr = substr($data, 0, strlen($matchStr));
if (strcmp($tmpStr, $matchStr) != 0) return "";
}
$typeStart = $matchStart + strlen($matchStr);
$dataType = substr($data, $typeStart, 1);
if (strcmp($dataType, "s") == 0) { /* string */
$lenStart = $typeStart + 2;
$lenEnd = strpos($data, ":", $lenStart) - 1;
$lenLen = $lenEnd - $lenStart + 1;
$strLen = substr($data, $lenStart, $lenLen);
$strStart = $lenEnd + 3;
$strResult = substr($data, $strStart, $strLen);
return $strResult;
} else if (strcmp($dataType, "i") == 0 ||
strcmp($dataType, "d") == 0) { /* number */
$numStart = $typeStart + 2;
$numEnd = strpos($data, ";", $numStart) - 1;
$numLen = numEnd - numStart + 1;
$numResult = substr($data, $numStart, $numLen);
return $numResult;
} else {
return "";
}
}
?>
最新技术文章: