人生路上,我们都是孤独的行者,如人饮水,冷暖自知真正能帮你的,永远只有你自己
乐与怒
海阔天空
Beyond
1993《乐与怒》

1992年,Beyond将事业发展重心移至日本,同时结束了与新艺宝长期合作的关系。成为国际化的乐队一直是Beyond的梦想,不过由于日本对于音乐制作上的严格要求,加上语言不通,Beyond颇为消沉了一阵子,但他们仍然十分努力 。1993年5月底,Beyond从日本返回到了香港,这一年也正值Beyond成立十周年之际,于是黄家驹写下了这首记录Beyond十年心路历程的歌曲《海阔天空》,歌词承载了黄家驹与乐队赴日本发展的艰辛与对理想的坚持 ,并收录在粤语专辑《乐与怒》中。这首歌曲也表达了黄家驹内心深处对香港乐坛的挣扎和失望。

即使遇到再大的风,在大的浪,也要勇敢的往前,只有勇往直前,才会见到胜利的曙光.机会不会等人太久,机遇更是可遇不可求,抓住机会把握好机遇,成功终会到来...

7073389471

祝所有的亲人、朋友新年快乐~ 快快乐乐每一天~~~ ​

写自己,写给自己

不经意的会想把一切都牢牢的握在手心,那时候也会去读鸡汤,也知道自己不能去握那一把沙子,以免到最后惨淡收场,觉得自己看的挺开...

最美中国大爷

王德顺,1936年出生于沈阳,人体艺术大师、电影演员。 1960年,王德顺开始做话剧演员。1985年,王德顺开始研究形体哑剧。1987年,王德顺将中国的哑剧带上世界哑剧舞台;1993年,王德顺创造“活雕塑”。2003年,王德顺参演何平执导《天地英雄》。2008年,王德顺参演张新建执导《闯关东》,2012年,王德顺参演张扬执导《飞越老人院》。2014年,王德顺参演董阿成执导电影《判若云泥》,并入围萨兰托电影节[2] 。2015年,王德顺参演陈正道执导《重返20岁》; 3月25日,王德顺在中国国际时装周在北京798艺术中心上演,因79岁的王德顺身材没有走样,精神矍铄,其光膀走秀的图片昨天爆红网络。

自用服务器检测

内涵段子

 é¸Ÿå“¥çš„博客 è®©PHP7达到最高性能的几个Tips ä¸­ï¼Œç¬¬ä¸€ç‚¹å°±æåˆ°äº†Opcache;

                    æœ¬ç«™è½¬è½½åœ°å€

    éƒ¨åˆ†åŽŸæ–‡å¦‚下:

记得启用Zend Opcache, 因为PHP7即使不启用Opcache速度也比PHP-5.6启用了Opcacheå¿«,所以之前测试时期就发生了有人一直没有启用Opcache的事情. 


那么,Opcache 到底是什么,为什么启用了Opcache 后PHP就会有如此高的性能提升?


相比于C/C++、Java而言,PHP、Python属于解释型语言,不产生机器码,而是产生中间码,我们把这个中间码称为 “Opcode”;

Opcode是一种PHP脚本编译后的中间语言,就像Java的ByteCode,或者.NET的MSL,举个例子,比如你写下了如下的PHP代码:


<?php

  echo "Hello World";

  $a = 1 + 1;

  echo $a;

?>


PHP执行这段代码会经过如下4个步骤:


1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)

2.Parsing, 将Tokens转换成简单而有意义的表达式

3.Compilation, 将表达式编译成Opocde

4.Execution, 顺次执行Opcode,每次一条,从而实现PHP脚本的功能。


而我们的代码,每次运行都会重复上面的四步;

但是,业务逻辑和功能一旦完成,处于生产阶段时,代码是基本不会变化的,因此,我们大多数时间并不需要重新编译生成Opcode;


如果我们可以将每次生成的Opcode保存下来,也就是省略前三步的编译过程,只执行第四步,那么我们PHP代码的执行效率将会得到一个质的提升;


而 OPcache 就是PHP官方提供的保存Opcode的工具,基本原理就是通过将 PHP 脚本预编译的字节码存储到共享内存中,省去了每次加载和解析 PHP 脚本的开销,从而大大提升 PHP 的性能。


在PHP 5.5.0 及后续版本中,官方已经绑定了 OPcache 扩展,不需要我们额外添加;对于 PHP 5.4及之前的版本可以使用 PECL 扩展中的 OPcache 库。


不管使用什么版本的PHP,都需要在php.ini中添加下面的代码,引入扩展:





保存php.ini并退出编辑器后,查看扩展是否引入成功:




在确定Opcache扩展库存在之后,接下来的工作就是修改php.ini 配置文件,启动Opcache即可;


以下是西岭老湿给出的简单配置,并且也已经表明了注释含义;

如果想具体查看其他配置及细节,请查看官方文档:

/php.net/manual/zh/opcache.configuration.php



/启用操作码缓存。如果禁用此选项,则不会优化和缓存代码。

/在运行期使用 ini_set() 函数只能禁用 opcache.enable 设置,不可以启用此设置。

/如果在脚本中尝试启用此设置项会产生警告。

opcache.enable=1


/仅针对 CLI 版本的 PHP 启用操作码缓存。

/通常被用来测试和调试。

opcache.enable_cli=1


/OPcache 的共享内存大小,以兆字节为单位。

/官方建议值 128

opcache.memory_consumption=64


/用来存储临时字符串的内存大小,以兆字节为单位.

/PHP 5.3.0之前的版本会忽略此配置指令。

/官方建议值 8

opcache.interned_strings_buffer=8


/OPcache 哈希表中可存储的脚本文件数量上限。

/真实的取值是在质数集合 { 223, 463, 983, 1979, 3907,  

/ 7963, 16229, 32531,65407, 130987 }

/中找到的第一个大于等于设置值的质数。

/设置值取值范围最小值是 200,

/最大值在 PHP 5.5.6 之前是 100000,

/PHP 5.5.6 及之后是 1000000。

/官方建议值 4000

opcache.max_accelerated_files=4000


/检查脚本时间戳是否有更新的周期,以秒为单位。

/设置为 0 会导致针对每个请求,

/OPcache 都会检查脚本更新。

/也可以简单理解为 缓存时长

opcache.revalidate_freq=30


/如果启用,则会使用快速停止续发事件。

/所谓快速停止续发事件是指依赖 Zend

/引擎的内存管理模块 一次释放全部请求

/变量的内存,而不是依次释放每一个已分配的内存块。

opcache.fast_shutdown=1



修改之后,重启服务器与php相关进程即可;


紧接着,我们对其效果进行测试:

代码文件如下:

<?php

echo 1;

?>

使用浏览器访问后,结果为 1 ;这是正常的;

但是紧接着修改代码,速度要快:

<?php

echo 2;

?>


使用浏览器访问后,结果仍然为 1 ;


不断刷新,大约30秒过后,输出结果为  2;

30秒的间隔就是Opcache为我们缓存了代码造成的;


最近boss找我反应这么一个问题,admin登录时间过短,客服以及审核部门在后台工作,稍微出去干点别的什么回来就需要重新登陆,这样不好,让改....

看过代码,admin的登录信息全部存在session里面的,都知道改session.gc_maxlifetime,我也是,但是改了之后没效果,该这样还怎样,尴尬了,从惠老板的博客里面看到了这篇文章,找到一些启发吧,当然还有之前的一篇,转出来备用~~



作者: Laruence(   )

本文地址: /www.laruence.com/2012/01/10/2469.html

转载请注明出处

今天在我的微博(Laruence)上发出一个问题:

我在面试的时候, 经常会问一个问题: &ldquo;如何设置一个30分钟过期的Session?&rdquo;, 大家不要觉得看似简单, 这里面包含的知识挺多, 特别适合考察基本功是否扎实, 谁来回答试试? 呵呵

为什么问这个问题呢?  1. 我在Twitter上看到了有人讨论这个问题, 2 想起来我经常问这个问题, 所以~~

在这里, 我来解答下这个题目.

第一种回答

那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime,  è¿™ç§å›žç­”是不正确的, 原因如下:

1.  é¦–å…ˆ, 这个PHP是用一定的概率来运行session的gc的, 也就是session.gc_probability和session.gc_divisor(介绍参看 深入理解PHP原理之Session Gc的一个小概率Notice), 这个默认的值分别是1和100, 也就是有1%的机会, PHP会在一个Session启动时, 运行Session gc. 不能保证到30分钟的时候一定会过期.

2. 那设置一个大概率的清理机会呢?  è¿˜æ˜¯ä¸å¦¥, 为什么?  å› ä¸ºPHP使用stat Session文件的修改时间来判断是否过期,\r\n 如果增大这个概率一来会降低性能, 二来, PHP使用&rdquo;一个&rdquo;文件来保存和一个会话相关的Session变量, \r\n假设我5分钟前设置了一个a=1的Session变量, 5分钟后又设置了一个b=2的Seesion变量, \r\n那么这个Session文件的修改时间为添加b时刻的时间, 那么a就不能在30分钟的时候, 被清理了. 另外还有下面第三个原因.

3. PHP默认的(Linux为例), 是使用/tmp 作为Session的默认存储目录, 并且手册中也有如下的描述:

Note: 如果不同的脚本具有不同的 session.gc_maxlifetime 数值但是共享了同一个地方存储会话数据,则具有最小数值的脚本会清理数据。此情况下,与 session.save_path 一起使用本指令。

也就是说, 如果有俩个应用都没有指定自己独立的save_path, 一个设置了过期时间为2分钟(假设为A), 一个设置为30分钟(假设为B), 那么每次当A的Session gc运行的时候, 就会同时删除属于应用B的Session files.

所以, 第一种答案是不&rdquo;完全严格&rdquo;正确的.

第二种答案

还有一种常见的答案是: 设置Session ID的载体, Cookie的过期时间, 也就是session.cookie_lifetime.  è¿™ç§å›žç­”也是不正确的, 原因如下:

这个过期只是Cookie过期,  æ¢ä¸ªè¯´æ³•è¿™ç‚¹å°±è€ƒå¯ŸCookie和Session的区别, Session过期是服务器过期, \r\n而Cookie过期是客户端(浏览器)来保证的, 即使你设置了Cookie过期, 这个只能保证标准浏览器到期的时候, \r\n不会发送这个Cookie(包含着Session ID), 而如果通过构造请求, 还是可以使用这个Session ID的值.

第三种答案

使用memcache, redis等, okey, 这种答案是一种正确答案.  ä¸è¿‡, 很显然出题者肯定还会接着问你, 如果只是使用PHP呢?

第四种答案

当然, 面试不是为了难道你, 而是为了考察思考的周密性. 在这个过程中我会提示出这些陷阱,  æ‰€ä»¥ä¸€èˆ¬æ¥è¯´, 符合题意的做法是:

1. 设置Cookie过期时间30分钟, 并设置Session的lifetime也为30分钟.

2. 自己为每一个Session值增加Time stamp.

3. 每次访问之前, 判断时间戳.

最后, 有同学问,  ä¸ºä»€ä¹ˆè¦è®¾ç½®30分钟的过期时间:  è¿™ä¸ª, 首先这是为了面试, 第二, 实际使用场景的话, 比如30分钟就过期的优惠劵?

thanks


CentOS增加swap分区大小centos

1. 查看当前分区情况


free -m


 å›¾ç‰‡.png


2. 增加 swap 大小, 2G 左右


dd if=/dev/zero of=/var/swap bs=1024 count=2048000 


图片.png


3. 设置交换文件


  1. mkswap /var/swap

     

  2. 图片.png




4. 立即激活启用交换分区


  1. swapon /var/swap  

图片.png


内存交换已经变大


5. 添加系统引导时自启动运行


  1. vi /etc/fstab  

添加一行


  1. /var/swap               swap                    swap    defaults        0 0  

图片.png






下面的是删除回收用的___酌情使用;

6. 收回 swap 空间


  1. swapoff /var/swap  

7. 从文件系统中回收


  1. rm /var/swap 


为这个问题纠结了一下,也总结出来了几种方案,

1,惠新宸大大的通过php.ini设置cookie,以及session.gc_maxlifetime,

2只设置session.gc_maxlifetime,

3也是最简便的,直接在tp的配置文件里面写入session过期时间

,图片.png

也是我最终用到的方案,


直接在tp的配置文件里面设定就可以了,不用修改线上环境,重启apache什么的,

最终也实现了session.gc_maxlifetime的重定义,以及session.cookie_lifetime的时间修改.



在web开发中,session是个非常重要的概念。Session一般译作会话,Session是一种基于HTTP协议的用以增强web应用能力的机制或者说一种方案,它不是单指某种特定的动态页面技术,而这种能力就是保持状态,也可以称作保持会话。


    在许多动态网站的开发者看来,session就是一个变量,而且其表现像个黑洞,他只需要将东西在合适的时机放进这个洞里,等需要的时候再把东西取出来。这是开发者对session最直观的感受,但是黑洞里的景象或者说session内部到底是怎么工作的呢?


    \r\nweb应用是基于HTTP协议的,而HTTP协议是一种无状态协议。也就是说,用户从A页面跳转到B页面会重新发送一次HTTP请求,而服务端在返回响应的时候是无法获知该用户在请求B页面之前做了什么的。解决HTTP协议自身无状态的方式有cookie和session。二者都能记录状态,前者是将状态数据保存在客户端,后者则保存在服务端。


    关于Cookie的介绍可以查看这两篇文章:Cookie简介或Cookie与Session的区别。今天主要讲的是Session的实现原理。


    session的基本原理是服务端为每一个session维护一份会话信息数据,而客户端和服务端依靠一个全局唯一的标识来访问会话信息数据。用户访问web应用时,服务端程序决定何时创建session,创建session可以概括为三个步骤:


生成全局唯一标识符(sessionid)
开辟数据存储空间。一般会在内存中创建相应的数据结构,但这种情况下,系统一旦掉电,所有的会话数据就会丢失,如果是电子商务网站,这种事故会造成严重的后果。不过也可以写到文件里甚至存储在数据库中,这样虽然会增加I/O开销,但session可以实现某种程度的持久化,而且更有利于session的共享;
将session的全局唯一标示符发送给客户端。
    关于服务器如何将session的唯一标识发送个客户端,主要有两种方式:cookie和URL重写。Cookie与Session的区别中也有写到,这里不再详述。下面就开始说说PHP中的Session。


    PHP中session方案包含的信息


session id \r\n用户session唯一标识符,随机生成的一串字符串,具有唯一性,随机性。主要用于区分其它用户的session数据。用户第一次访问web页面的时候,php的session初始化函数调用会分配给当前来访用户一个唯一的ID,也称之为session_id。
session data 我们把需要通过session保存的用户状态信息,称为用户session数据,也称为session数据。一般是在当前session生命周期,相应用的$_SESSION数据。
session file \r\nPHP默认将session数据存放在一个文件里。我们把存放session数据的文件称为session文件。它由特殊的php.ini设置session.save_path指定session文件的存放路径,CentOS5.3操作系统,PHP5.1默认存放在/var/lib/php/session目录中。用户session文件的名称,就是以sess_为前缀,以session_id为结尾命名,比如session\r\n \r\nid为vp8lfqnskjvsiilcp1c4l484d3,那么session文件名就是sess_vp8lfqnskjvsiilcp1c4l484d3
session lifetime 我们把初始化session开始,直到注销session这段期间,称为session生命周期,这样有助于我们理解session管理函数。
    由此,我们可见:当每个用户访问web, PHP的session初始化函数都会给当前来访用户分配一个唯一的session \r\nID。并且在session生命周期结束的时候,将用户在此周期产生的session数据持久到session文件中。用户再次访问的时候,session初始化函数,又会从session文件中读取session数据,开始新的session生命周期。


    php.ini中与Session相关的设置:


session.save_handler = file 用于读取/回写session数据的方式,默认是files。它会让PHP的session管理函数使用指定的文本文件存储session数据
session.save_path = “/var/lib/php/session” \r\n指定保存session文件的目录,可以指定到别的目录,但是指定目录必须要有httpd守护进程属主(比如apache或www等)写权限,否则无法回存session数据。当指定目录不存在时,php\r\n session环境初始化函数是不会帮你创建指定目录的,所以需要你手工建立指定目录。它还可以写成这样session.save_path = \r\n“N;/path” \r\n其中N是整数。这样使得不是所有的session文件都保存在同一个目录中,而是分散在不同目录。这对于服务器处理大量session文件是很有帮助的。(注:目录需要自己手工创建)
session.auto_start = 0 如果启用该选项,用户的每次请求都会初始化session。我们推荐不启用该设置,最好通过session_start()显示地初始化session。
    Session相关PHP函数和事件


session_start() \r\n函数session_start会初始化session,也标识着session生命周期的开始。要使用session,必须初始化一个session环境。有点类似于OOP概念中调用构造函数构创建对象实例一样。session初始化操作,声明一个全局数组$_SESSION,映射寄存在内存的session数据。如果session文件已经存在,并且保存有session数据,session_start()则会读取session数据,填入$_SESSION中,开始一个新的session生命周期。
$_SESSION \r\n它是一个全局变量,类型是Array,映射了session生命周期的session数据,寄存在内存中。在session初始化的时候,从session文件中读取数据,填入该变量中。在session生命周期结束时,将$_SESSION数据写回session文件。
session_register() \r\n在session生命周期内,使用全局变量名称将注全局变量注册到当前session中。所谓注册,就是将变量填入$_SESSION中,值为NULL。它不会对session文件进行任何IO操作,只是影响$_SESSION变量。注意,它的正确写法是session_register(‘varname’),而不是session_register($varname)
session_unregister() 与session_register操作正好相反,即在session生命周期,从当前session注销指定变量。同样只影响$_SESSION,并不进行任何IO操作。
session_unset() \r\n在session生命周期,从当前session中注销全部session数据,让$_SESSION成为一个空数组。它与unset($_SESSION)的区别在于:unset直接删除$_SESSION变量,释放内存资源;另一个区别在于,session_unset()仅在session生命周期能够操作$_SESSION数组,而unset()则在整个页面(page)生命周期都能操作$_SESSION数组。session_unset()同样不进行任何IO操作,只影响$_SESSION数组。
session_destroy() \r\n如果说session_start()初始化一个session的话,而它则注销一个session。意味着session生命周期结束了。在session生命周期结整后,session_register,\r\n session_unset, \r\nsession_register都将不能操作$_SESSION数组,而$_SESSION数组依然可以被unset()等函数操作。这时,session意味着是未定义的,而$_SESSION依然是一个全局变量,他们脱离了关映射关系。
     é€šè¿‡session_destroy()注销session,除了结束session生命周期外,它还会删除sesion文件,但不会影响当前$_SESSION变量。即它会产生一个IO操作。


session_regenerate_id() 调用它,会给当前用户重新分配一个新的session \r\nid。并且在结束当前页面生命周期的时候,将当前session数据写入session文件。前提是,调用此函数之前,当前session生命周期没有被终止(参考第9点)。它会产生一个IO操作,创建一个新的session文件,创建新的session文件的是在session结束之前,而不是调用此函数就立即创建新的session文件。
session_commit() \r\nsession_commit()函数是session_write_close()函数的别名。它会结束当前session的生命周期,并且将session数据立即强制写入session文件。不推荐通过session_commit()来手工写入session数据,因为PHP会在页面生命周期结束的时候,自动结束当前没有终止的session生命周期。它会产生一个IO写操作。
end session \r\n结束session,默认是在页面生命周期结束的之前,PHP会自动结束当前没有终止的session。但是还可以通过session_commit()与session_destroy()二个函数提前结束session。不管是哪种方式,结束session都会产生IO操作,分别不一样。默认情况,产生一个IO写操作,将当前session数据写回session文件。session_commit()则是调用该函数那刻,产生一个IO写操作,将session数据写回session文件。而session_destroy()不一样在于,它不会将数据写回session文件,而是直接删除当前session文件。有趣的是,不管是session_commit(),还是session_destroy()都不会清空$_SESSION数组,更不会删除$_SESSION数组,只是所有session_*函数不能再操作session数据,因为当前的session生命周期终止了,即不能操作一个未定义对象。
    Session ID 是如何传递的?


    session终究是因为管理用户状态信息才存在的。session \r\nid是用户表明身份的一种标识,就像入场券一样。用户一旦从被分配了session id之后的每次访问(http请求)都会携带这个session \r\nid给服务端,用于加载该用户的session数据。


    \r\n用户端与服务端的web通信协议是http。而PHP通过http取得用户数据惯用的三种方法分别是:POST方法、GET方法还有Cookie。而PHP默认传递方法正是Cookie,也是最佳方法。只有在客户端不支持Cookie的时候(浏览器禁用了Cookie功能)才会通过GET方法来传递session_id,即通过在URL的query_string部分传递session\r\n id。


    确定了传递方法,我们还有必要清楚一下session \r\nid的传递过程。用户通过浏览器访问网页,将URL输入地址栏回车,浏览器发出请求,在调用sockect \r\nsend之前浏览器引擎会搜索有效的Cookies记录封装在http请求头的Cookie字段一同发送出去。服务端器接收到请求后,交给PHP处理。这时session初始化函数如果在$_COOKIE中没有找到以session_name()作为键值存储的生素(值为session\r\n \r\nid),则会以为用户是第一次访问web。作为第一次访问的用户,session初始化函数总会随机生成一个session_id并且通过setcookie()函数调用将新生成的session_id以”sesseson_name\r\n = \r\nsession_id”的格式填入http响应头Set-Cookie字段,发送给客户端(这样接下来的请求,http请求头Cookie字段都会携带该Cookie记录给web服务器)。如果初始化函数发现用户端Cookies中已定义了存在$_COOKIE[‘sess_name’],则会加载与$_COOKIE[‘sess_name’]相对应的session文件($_COOKIE[‘sess_name’]就是session\r\n ID)。如果用户Cookie记录过期,则会被浏览器删除。之后的下一次请求,服务器会以为用户又是第一次访问,如此循环。


    php.ini中Session ID 相关设置


session.use_cookie = 1 是否采用Cookie方法传递session id值。默认是1,表示启用。
session.name = PHPSESSID \r\n不管是Cookie传递sessioin_id,还是GET方法传递session_id,都需要使用键值。他们的格式分别是Cookie: \r\nsess_name=session_id;和/path.php?sess_name=session_id,其中sess_name就是由这里指定的。
session.use_only_cookies = 0 表示只使用Cookie 的方法传递session \r\nid。我们说过,传递cookie的方法,除了cookie,还有GET方法,GET方法是不安全的方法。在用户端禁用了cookie的时候,会采用GET方法传递session_id,可以通过这个设置禁用GET方法传递session_id。
session.cookie_lifetime = 0, session.cookie_path = / \r\n以及session.cookie_domain = \r\n如果使用Cookie方法传递session_id的话,这里分别指定了cookie有效域、目录和时间。分别对应setcookie()函数的形参$expire、$path和$domain。其中cookie_lifetime=0表示直到关闭浏览器才删除Cookie。还可以使用session_set_cookie_params()函数修改这些值。
session_name([string $name]) \r\n获取或更新session_name。如果传了name,则表示不使用默认的名称PHPSESSID(由session.name)指定,否则获取当前session_name。注意:如果设置session_name,则必须在session_start()之前调用才生效。
session_id([string $id]) 与session_name()类似,但它是读取或者设置session_id的方法。同样,设置session_id的话,必须在session_start()之前调用才有效。
session_set_cookie_params()和session_get_cookie_params() \r\n通过session_set_cookie_params()可以重新设定session.cookie_lifetime, \r\nsession.cookie_path以及session.cookie_domain这三个php.ini设置。而session_get_cookie_params()则是获取这些设定的值。
    Session的回收


    我们知道session数据存放在服务端指定的session.save_path目录中,同时会在用户端存放一条Cookie用以记录分配给用户的session id。所以,session数据失效分服务端和客户端,要删除(回收)的对象也很清楚:


服务端:删除过期的session文件,启动PHP GC回收。
用户端:使存储了过期session_id的用户端Cookie记录过期。通过将Cookie的Expire设置为负值,要求客户端删除Cookie。
    服务端:删除过期的session文件


    PHP \r\nGC进程被启动以后,则会扫描session.save_path,找出过期的session,并删除该session文件。所谓,过期的session,是指操作系统当前时间与session文件最后访问时间之差大于session.gc_maxlifetime的话,该session认为是过期了。注意:有时候,你会发现,即便是文件过期了,有可能也没有被及时地删除掉。这是因为,每次session初始化的时候,并不会都启动PHP\r\n GC进程的,启动GC进程会大大降低php的运行效率。所有一个启动概率,这个概率由php.ini设定session.gc_probability\r\n / session.gc_divisor二个设置决定,默认概率是1%(1/1000)。这意味着,每1000次用户请求中,会启动1次PHP \r\nGC回收session文件。


    客户端:删除过期session id的cookie记录


    \r\n如果用户发现session已经过期,但是服务端的GC还没有启动,服务端可以手通过手工代码setcookie的方式要求用户端浏览器删除键值为session_name()的Cookie记录。这样,下回访问的时候,浏览器以为用户是第一次访问,并且重新给访问用户分配一个新的session_id。


    php.ini中与session相关的设置


session.gc_probability和session.gc_divisor \r\n由这二个函数决定了启用GC的概率,默认是1/1000。也就是说每一千次用户请求中有一次会启动GC回收session。启动GC进程不宜过于频繁。上面的例子我们可以看到它会每次检查session.save_path目录下每个文件的状态。这样会降低php的执行效率。
session.gc_maxlifetime = 1440 设置session存活时间,单位是秒。每次GC启动后, \r\n会通过stat得到session文件最后访问的unix时间,通过现在时间减去文件最后访问时间之间大于session.gc_maxlifetime则会删除该文件。

################################################运维层面####################
strace -p pid  php-cgi中高负载的进程

\r\n  stat("/tmp/sess_6dedc3de5539804adb4e0f17b88f8f46", {st_mode=S_IFREG|0600, st_size=0, ...}) = 0 
有大量的这样的记录就可确定写seesion导致的i/o问题,解决方法如下:
写内存:

#!/bin/sh
set -x
I="0 1 2 3 4 5 6 7 8 9 a b c d e f"
for acm in $I;
do
for x in $I;
do
mkdir -p /dev/shm/sessions/$acm/$x;
done;
done
chown -R nobody:nobody /dev/shm/sessions
chmod -R 1777 /dev/shm/sessions
因为/dev/shm/sessions是用的内存,服务器重启后,里面的所有文件都会丢失,所以,需要把上面的脚本加入到 /etc/rc.local中,并且要放在启动php之前

因为/dev/shm/sessions是用的内存,服务器重启后,里面的所有文件都会丢失,所以,需要把上面的脚本加入到 /etc/rc.local中,并且要放在启动php之前


第三步,将session存储到不同的目录中
php本身支持session的多级散列
在php.ini中,将 ;session.save_path = /tmp 改为
session.save_path = "2;/dev/shm/sessions"

表示将session存储到 /dev/shm/session这个文件夹中,并且是用2级散列。
保存退出
切记,等第四步结束后迅速重启php,否则会有部分session不同步的现象
删除原有的session  
 rm -f /tmp/*
第五步,session的回收
session在使用2分法,更改过默认存储路径后,会无法定时删除sessions
所以我们需要手动定时删除,下面这个命令可以删除过期的session
我这里定义的过期时间是3小时内

*/10 * * * * /bin/find /tmp/sessions/  -amin +180 -type f -exec rm -rf {} \;

crontab  10分钟一扫
 ok!


404-581-6816
© Ning|寜   Design by Ning  åŸºäºŽThinkPHP制作  QQ:976383555  Email:nono0903@gmail.com