PHP 分类中的最新日记

先来看下自定义数据库处理 session 的执行顺序:
sess_open
sess_read
sess_gc
...其他程序
sess_write || sess_destroy
sess_close

// $domain = '';
//不使用 GET/POST 变量方式
ini_set('session.use_trans_sid', 0);
//设置垃圾回收最大生存时间
ini_set('session.gc_maxlifetime', 1440);
//使用 COOKIE 保存 SESSION ID 的方式
ini_set('session.use_cookies', 0);
//ini_set('session.cookie_path',      '/');
//多主机共享保存 SESSION ID 的 COOKIE
//ini_set('session.cookie_domain', $domain);
//设置用户自定义Session存储
ini_set('session.save_handler', 'user');
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);

session_set_save_handler(
	'sess_open',
	'sess_close',
	'sess_read',
	'sess_write',
	'sess_destroy',
	'sess_gc'
);

$SESS_DB = '';
$SESS_DBHOST = '127.0.0.1'; /* database server hostname */
$SESS_DBPORT = 5432; /* database server port */
$SESS_DBNAME = 'DBNAME'; /* database name */
$SESS_DBUSER = 'DBUSER; /* database user */
$SESS_DBPASS = 'DBPASS'; /* database password */
$SESS_LIFE = ini_get('session.gc_maxlifetime');
$SESS_NAME = 'SNAME';


function sess_open($save_path, $session_name){
	global $SESS_DB, $SESS_DBHOST, $SESS_DBPORT, $SESS_DBNAME, $SESS_DBUSER, $SESS_DBPASS;
	$SESS_DB = pg_connect("host=$SESS_DBHOST port=$SESS_DBPORT dbname=$SESS_DBNAME user=$SESS_DBUSER password=$SESS_DBPASS") or die('Could not connect');
	return true;
}

function sess_close(){
	global $SESS_DB;
	if(!empty($SESS_DB)){
		pg_close($SESS_DB);
	}
	return true;
}

function sess_read($key){
	global $SESS_DB, $SESS_LIFE, $uid, $uip;
	自定义
	return false;
}

function sess_write($key, $val){
	global $SESS_DB, $SESS_LIFE, $uid, $ip;
	$expiry = time() + $SESS_LIFE;
	$value = addslashes($val);
	自定义
}

function sess_destroy($key){
	global $SESS_DB;
	自定义
}

function sess_gc($maxlifetime){
	global $SESS_DB;
	自定义
}

PHP 计算排列组合的函数

  1. $CombinList[0][0] = 'a1';
  2. $CombinList[0][1] = 'a2';
  3. $CombinList[1][0] = 'b4';
  4. $CombinList[1][1] = 'b5';
  5. $CombinList[1][2] = 'b6';
  6. $CombinList[2][0] = 'c7';
  7. $CombinList[2][1] = 'c8';
  8.  
  9. function combin($CombinList){
  10. $CombineCount = 1;
  11. foreach($CombinList as $Key => $Value){
  12. $CombineCount *= count($Value);
  13. }
  14. $RepeatTime = $CombineCount;
  15. foreach($CombinList as $ClassNo => $StudentList){
  16. $RepeatTime = $RepeatTime/count($StudentList);
  17. $StartPosition = 1;
  18. foreach($StudentList as $Student){
  19. $TempStartPosition = $StartPosition;
  20. $SpaceCount = $CombineCount/count($StudentList)/$RepeatTime;
  21. for($J = 1; $J <= $SpaceCount; $J ++){
  22. for($I = 0; $I < $RepeatTime; $I ++){
  23. $Result[$TempStartPosition + $I][$ClassNo] = $Student;
  24. }
  25. $TempStartPosition += $RepeatTime * count($StudentList);
  26. }
  27. $StartPosition += $RepeatTime;
  28. }
  29. }
  30. return $Result;
  31. }
  32.  
  33. echo "<pre>";
  34. $Result = combin($CombinList);
  35. print_r($Result);
  36. foreach($Result as $k=>$v){
  37. echo(implode('-', $v));
  38. echo($wrap);
  39. }
  40. echo "</pre>";
  41.  
  42. /*
  43. 结果是:
  44.  
  45. Array
  46. (
  47.   [1] => Array
  48.   (
  49.   [0] => a1
  50.   [1] => b4
  51.   [2] => c7
  52.   )
  53.  
  54.   [2] => Array
  55.   (
  56.   [0] => a1
  57.   [1] => b4
  58.   [2] => c8
  59.   )
  60.  
  61.   [3] => Array
  62.   (
  63.   [0] => a1
  64.   [1] => b5
  65.   [2] => c7
  66.   )
  67.  
  68.   [4] => Array
  69.   (
  70.   [0] => a1
  71.   [1] => b5
  72.   [2] => c8
  73.   )
  74.  
  75.   [5] => Array
  76.   (
  77.   [0] => a1
  78.   [1] => b6
  79.   [2] => c7
  80.   )
  81.  
  82.   [6] => Array
  83.   (
  84.   [0] => a1
  85.   [1] => b6
  86.   [2] => c8
  87.   )
  88.  
  89.   [7] => Array
  90.   (
  91.   [0] => a2
  92.   [1] => b4
  93.   [2] => c7
  94.   )
  95.  
  96.   [8] => Array
  97.   (
  98.   [0] => a2
  99.   [1] => b4
  100.   [2] => c8
  101.   )
  102.  
  103.   [9] => Array
  104.   (
  105.   [0] => a2
  106.   [1] => b5
  107.   [2] => c7
  108.   )
  109.  
  110.   [10] => Array
  111.   (
  112.   [0] => a2
  113.   [1] => b5
  114.   [2] => c8
  115.   )
  116.  
  117.   [11] => Array
  118.   (
  119.   [0] => a2
  120.   [1] => b6
  121.   [2] => c7
  122.   )
  123.  
  124.   [12] => Array
  125.   (
  126.   [0] => a2
  127.   [1] => b6
  128.   [2] => c8
  129.   )
  130.  
  131. )
  132. a1-b4-c7
  133. a1-b4-c8
  134. a1-b5-c7
  135. a1-b5-c8
  136. a1-b6-c7
  137. a1-b6-c8
  138. a2-b4-c7
  139. a2-b4-c8
  140. a2-b5-c7
  141. a2-b5-c8
  142. a2-b6-c7
  143. a2-b6-c8
  144. */

View this snippet on OpenTags.org

mysql -u 用户名 -p密码 数据库 < 导入的文件名.sql
mysqldump -u 用户名 -p密码 数据库 > 导出的文件名.sql

注意:-p密码间不要有空格。

中文数据最好定义字符集
自定义字符集命令:--default-character_set=字符集
字符集可以是:big5、cp1251、cp1257、czech、danish、dec8、dos、euc_kr、gb2312、gbk、german1、hebrew、hp8、hungarian、koi8_ru、koi8_ukr、latin1、latin2、sjis、swe7、tis620、ujis、usa7、win1251或win1251ukr之一。
前两次写了Windows Live ID当作OpenID使用的方法Google的OpenID的登陆,这次写Yahoo的OpenID的实现方法。

先说一下Yahoo的OpenID仅有Plaxo等几个网站可以获取用户属性,所以暂时不要考虑这个东西吧。

而且Yahoo还会出现了下面这段警告:
Warning: This website has not confirmed its identity with Yahoo! and might be fraudulent. Do not share any personal information with this website unless you are certain it is legitimate.
你是不是很郁闷呢?其实解决方法很简单,请参考:http://tihualong.javaeye.com/blog/309246
...

因为其他的OpenID提供者同时支持OpenID1.1与OpenID2.0协议,但是Yahoo的程序员像我们一样不喜欢考虑兼容性的问题。只支持OpenID2.0协议标准。

那么OpenID2.0协议标准有什么特殊的地方呢?

OpenID2.0中提出了一个新的东西叫做OpenID Relying Party discovery的,我们的问题就出在这个OpenID Relying Party discovery上。

先解释一下这个OpenID Relying Party discovery是什么东西。

当你重定向到OpenID提供者站点去请求认证的时候,OpenID提供者会使用这个叫做OpenID Relying Party discovery的机制自动验证return_to的URL处于指定的范围内,并且与OP通过realm参数获取到的XRDS文档中获取到的return_to的URL相同。

我是这么理解的:我的Consumer程序告诉了OP我的return_to地址是什么,但是OP不信任我,要通过我的realm参数(注意:这个地方是OP向RP发出的请求,所以要求你realm参数的url必须是外网的ip地址或者能通过外部的DNS查找到的域名)查找一个基于yadis协议的XRDS文档中的return_to地址,两个return_to地址相比较,如果相同,好,我相信你了,放行。(不知道这样理解有没有问题,我觉得应该没问题吧)

好,原理理解了。下面我们要做的就是:

1、 编写一个XRDS文档保存到你的网站上,存放成什么扩展名的没什么关系,但是你要保证Yahoo或者其他OP获取到这个文档的Content-Type是" application/xrds+xml",不然他们会认为这个文档不是他们要找的文档。

2、 将你第一步编写的XRDS文档的地址公布在你网站的首页,或者你的openid.realm参数指定的页面上(建议)

我们先来编写XRDS文档:(起名xrds.php)
<?php
header('Content-type: application/xrds+xml');
?>
<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="1">
<Type>http://specs.openid.net/auth/2.0/return_to</Type>
<URI>改成你的return_url地址</URI>
</Service>
</XRD>
</xrds:XRDS>

将你编写的XRDS文档的地址公布在openid.realm指定的页面,建议单独写一个页面维护,然后设置openid.realm参数为你创建的这个页面
<?php
header('X-XRDS-Location: 改成你的xrds.php地址');
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-XRDS-Location" content="改成你的xrds.php地址"/>
</head>
<body>
网页内容
</body>
</html>


if(empty($_REQUEST['openid_mode'])){
$openid_server = 'https://open.login.yahooapis.com/openid/op/auth';
$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.mode'] = 'associate';
$data['openid.assoc_type'] = 'HMAC-SHA1';
$data['openid.session_type'] = 'no-encryption';
$AssocHandle = getAssociationHandle($openid_server.'?'.http_build_query($data));
setcookie('cookieAssocHandle', $AssocHandle);
unset($data);

$data['openid.assoc_handle'] = $AssocHandle;
$data['openid.ax.mode'] = 'fetch_request';
$data['openid.ax.required'] = 'attr1,attr2,attr3,attr4,attr5';
$data['openid.ax.type.attr1'] = 'http://axschema.org/contact/email';
$data['openid.ax.type.attr2'] = 'http://axschema.org/namePerson/first';
$data['openid.ax.type.attr3'] = 'http://axschema.org/namePerson/last';
$data['openid.ax.type.attr4'] = 'http://axschema.org/contact/country/home';
$data['openid.ax.type.attr5'] = 'http://axschema.org/pref/language';
$data['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$data['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$data['openid.mode'] = 'checkid_setup';
$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.ns.ax'] = 'http://openid.net/srv/ax/1.0';
$data['openid.ns.sreg'] = 'http://openid.net/extensions/sreg/1.1';
$data['openid.realm'] = $RealmUrl;
$data['openid.return_to'] = $AuthUrl;
$data['openid.sreg.optional'] = 'nickname,email,fullname,dob,gender,postcode,country,language,timezone';
$data['openid.sreg.policy_url'] = $PolicyUrl;
$data['openid.sreg.required'] = 'email';
$data['openid.trust_root'] = $RealmUrl;
//$data['xopenid_lang_pref'] = 'tw';

$LocationUrl = $openid_server.'?'.http_build_query($data);
}else{
if('id_res' == $_REQUEST['openid_mode']
&& $AssocHandle == $_REQUEST['openid_assoc_handle']){
$openid = !empty($_REQUEST['openid_identity']) ? formUrl($_REQUEST['openid_identity']) : formUrl($_REQUEST['openid_claimed_id']);
$email = $_REQUEST['openid_sreg_email'];
$fullname = $_REQUEST['openid_sreg_fullname'];
$nickname = $_REQUEST['openid_sreg_nickname'];
$timezone = $_REQUEST['openid_sreg_timezone'];
}
echo('<pre>');
echo("<a href=$LoginUrl>BACK</a>\n\n");
print_r($_REQUEST);
echo('</pre>');
}

注意:有部分函数和变量有遗漏,请参考Windows Live ID当作OpenID使用的方法Google的OpenID的登陆
Mr Wang

王炜,现在福建泉州从事 B2C 电子商务。爱好编程,业余时间在 FreeBSD / Apache / PHP / PostgerSQL 平台开发 B/S 架构的免费软件。

订阅Feed 订阅 王炜's Blog

Follow Google Buzz Twitter Facebook LinkedIn Sina

收藏王炜's Blog

关于此归档

这里是分类PHP中的最新日记。

上一个分类OpenID

下一个分类PostgreSQL

首页归档页可以看到最新的日记和所有日记。