默认情况下开启PHP会话,会在服务器端创建一个sess_PHPSESSID文件,返回一个名为PHPSESSID的cookie给浏览器.PHP操作$_SESSION数组添加和访问会话数据.
PHP同一个会话之间共享同一个对象实例:
object通过serialize序列化成string,然后保存到会话变量中:
$_SESSION['object'] = serialize($object);
在使用这个会话(PHPSESSID)发出的其他http请求通过反序列化获取对象:
$object = unserialize($_SESSION['object']);
当然,数组也一样可以这样存储到一个会话变量中,非常方便有木有.
PHP会话存储默认使用files,对应php.ini配置项session.save_handler=files
存储位置默认是/tmp,对应session.save_path=/tmp
如果你觉得用文件系统保存会话文件会造成磁盘I/O过大,你完全可以用Memcache/Redis来存储会话.
PECL扩展memcache和redis都提供了session处理器,用于存储PHP会话内容.
http://pecl.php.net/package/memcache
http://php.net/manual/zh/memcache.ini.php
http://pecl.php.net/package/redis
https://github.com/nicolasff/phpredis/
Ubuntu可以这样安装:
sudo apt-get install memcached redis-server
sudo apt-get install php5-memcache php5-redis
pear install pecl/memcache
配置php.ini,加入:
extension=memcache.so
extension=redis.so
再把
session.save_handler = files
session.save_path = "/tmp"
改为(memcache):
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
改为(redis):
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
session.save_path中多台memcache/redis服务器可以用逗号隔开.
PHP同一个会话之间共享同一个对象实例:
object通过serialize序列化成string,然后保存到会话变量中:
$_SESSION['object'] = serialize($object);
在使用这个会话(PHPSESSID)发出的其他http请求通过反序列化获取对象:
$object = unserialize($_SESSION['object']);
当然,数组也一样可以这样存储到一个会话变量中,非常方便有木有.
PHP会话存储默认使用files,对应php.ini配置项session.save_handler=files
存储位置默认是/tmp,对应session.save_path=/tmp
如果你觉得用文件系统保存会话文件会造成磁盘I/O过大,你完全可以用Memcache/Redis来存储会话.
PECL扩展memcache和redis都提供了session处理器,用于存储PHP会话内容.
http://pecl.php.net/package/memcache
http://php.net/manual/zh/memcache.ini.php
http://pecl.php.net/package/redis
https://github.com/nicolasff/phpredis/
Ubuntu可以这样安装:
sudo apt-get install memcached redis-server
sudo apt-get install php5-memcache php5-redis
pear install pecl/memcache
配置php.ini,加入:
extension=memcache.so
extension=redis.so
再把
session.save_handler = files
session.save_path = "/tmp"
改为(memcache):
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
改为(redis):
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
session.save_path中多台memcache/redis服务器可以用逗号隔开.
session.save_path里的URL还可以可以包含一些参数,比如memcache的persistent,weight,timeout,retry_interval.
不能说PHP的session性能很烂,而是说计算机的io效率不高!
PHP默认session是以文件形式保存在本地文件系统中,每次访问都是做io操作,并发大的时候,必然会导致session文件爆发,导致读取文件变慢。
换一种方式,将session保存到内存或者数据库,性能会提高。
php session原理就这么简单,只看你运用了。
至于说cookie代替session就会提高,那是没什么依据的。cookie数据量有限制,而且cookie数据量大了以后,直接消耗你的带宽流量。
现在都是把session保存到memcached中