php session阻塞页面分析及优化 (session_write_close session_commit使用)

php 开发时一个启用了session_start()页面,由于执行时间过长,导致如果一个用户在访问,另一个用户启用session_start()的时候处于阻塞状态。

直到第一个用户完毕 ,第二个才能启用。开始读取。这就是session阻塞。

session 默认以文件保存,当一个用户访问session_start页面后。这个时候,就会默认创建一个包含 session_id文件名,并且这个时候。会对文件进行锁定。如果这个用户点击链接。又访问一个该站的session文件,由于 第一个页面没有执行完。他一直锁定了该文件。所以第二个页面就不能获取锁,一直处于等待状态、。这样如果是网站上有大量的用户访问,会导致session读取文件一直阻塞等待着,用户浏览器一直跟服务器保持连接买回消耗很多服务器资源 、web 服务站活跃连接数也会增大。可能就会耗费完连接资源。出现拒绝服务器。

------用memcache 存放用户session

 用memcache  保存用户session ,相比读取文件有很大速度提升。而且可以做到服务器共享session 确实很方便,这个时候就不会出现 用文件session 锁定清理、memcached 读取时候,是共享的,不会出现等待,但是我们发现。memcached 连接数。还是会保持着,并且,连接数会增加。如果这个时候。你设置的memcached连接数过小。你会发现。很快memcached 就挂死了。 这也是长出现的问题。,有时候web 服务器很多,session(memcache)很少,发现memcache 莫名死掉。可能跟这个有关系。太多的反映很慢的页面(启用session) ,会大道至占用太多的memcached连接数。

 

改变session使用习惯、优化调用方法

其实,通过file或者session,如果处理耗时页面,都会带来服务器资源很大消耗。

实我们一般写入session或者读取时候,如果自己能够控制。

用完了,就关闭掉文件锁,或者mem连接。就会自动释放资源,其实,php里面的:session_write_close,session_commit 函数就能做到改功能。

 

 

<?php
ini_set(‘session.save_path‘,‘/tmp/‘);

function open($save_path, $session_name)
{
  echo __FUNCTION__,"<br />";
  return(true);
}
function close()
{
  echo __FUNCTION__,"<br />";
  return(true);
}
function read($id)
{
  echo __FUNCTION__,"<br />";
}
function write($id, $sess_data)
{
  echo __FUNCTION__,"<br />";
  return(true);
}
function destroy($id)
{
  echo __FUNCTION__,"<br />";
  return(true);
}
function gc($maxlifetime)
{
  echo __FUNCTION__,"<br />";
  return true;
}
session_set_save_handler("open", "close", "read", "write", "destroy", "gc");
register_shutdown_function(‘test‘);

function test()
{
  echo __FUNCTION__,"<br />";
}
session_start();
echo ‘aaaaa‘,"<br />";

启动”session_start” 会自动执行,open,read函数,然后页面执行完,会执行shutdown函数,最后会把session写入进去,然后执行close关闭文件。从session_start 到页面结束,会一直锁定文件或者保持连接的。

 

我们如果 执行完session_start后,执行”session_commit();” 看看结果

 

执行过程: 执行commit后,直接会调用,wirte,close操作。直接关闭文件或者关闭连接(memcache)了。

 

  • 我们的问题

1.我们页面有多次写入,怎么样操作?

 

第一次写入后,然后提交,再次打开写入,然后再次提交。我们发现,2次数据都保存到用户session中了。

 

  • 我们来总结下吧

1.只读取session页面,建议打开后,就直接commit,这是$_SESSION变量已经生成了。

2.有对session进行写入页面,建议修改完$_SESSION后,直接调用commit

3.多次打开并且写入,这个不建议使用,比较打开文件,写入都是耗费时间的。如果能一次搞定的,就不要做多次了。 除非,中间执行很耗时的业务。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。