php优化session的使用

php的session扩展可以将session数据存入任意容器,只要容器实现了php_session.h中的接口:

typedef struct ps_module_struct {
	const char *s_name;
	int (*s_open)(PS_OPEN_ARGS);
	int (*s_close)(PS_CLOSE_ARGS);
	int (*s_read)(PS_READ_ARGS);
	int (*s_write)(PS_WRITE_ARGS);
	int (*s_destroy)(PS_DESTROY_ARGS);
	int (*s_gc)(PS_GC_ARGS);
	char *(*s_create_sid)(PS_CREATE_SID_ARGS);
} ps_module;

如果在php.ini中定义了session.auto_start = 1,session扩展在请求初始化阶段(rinit)会调用s_open并s_read数据。
如果在php页面中调用了session_start()(只有第一次调用生效),session扩展也会调用s_open并s_read数据。
但是对于一些涉及不到session数据的页面,如果也去读取session数据会造成性能上的浪费,如磁盘操作或网络操作。
所以要想个办法对涉及session数据和不涉及session数据的页面区别对待,但是处理代码需要是一致的。
想的办法就是去掉session.auto_start = 1改成session.auto_start = 0并对cookie中没有session_name的请求延迟调用session_start(),
如果cookie中没有session_name,调用session_start()时,session扩展会自动生成一个session_id并发送Set-Cookie头,头信息的输出要在页面输出内容前或者把页面内容放入输出缓冲延迟输出。
最终的实现方式如下:
auto_prepend_file:

<?php
if (isset($_COOKIE[session_name()])) {
	define('SESSION_STARTED', true);
	@session_start();
} else {
	ob_start();
}

auto_append_file:
<?php
if (!defined('SESSION_STARTED') && $_SESSION) {
	$session_copy = $_SESSION;
	@session_start();
	if (!$_SESSION) {
		$_SESSION = $session_copy;
	}
	ob_end_flush();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值