一:介绍:
用户在访问一个Web应用程序时(例如访问www.imop.us),如果能在Web服务器上存储用户或会话的特定数据,从而每次请求网页时能很容易地访问这些数据将非常有用。存储的可以是有关用户、用户首选项的信息,或者是与应用程序相关的数据。用户每次请求包含session_start()函数调用的网页时,服务器会开始一个新进程(或重用一个空闲进程),PHP引擎将在查询字符串或cookie数据中查找一个会话ID。这会获取到已保存的会话数据,并建立$_SESSION数组。
$_SESSION是一个超全局变量,可以从任何代码段直接访问。如果会话是活动的,可以从$_SESSION数组获取、增加、更新和删除值。这与处理任何其他变量是类似的。引擎会在脚本结束时自动保存数组的值,除非因为错误异常中止。会话数据文件会锁定,以避免多个进程同时访问(写)相同的数据。如果脚本执行的时间很长,或者要从同一个服务器加载多个帧,可以优化应用程序,使用session_write_close(),该函数没有返回值,别名(session_commit())关闭会话数据文件。不论使用其中哪一个命令,之后都不能再向$_SESSION数组增加新的值。
共享内存是在进程中共享数据的另一种办法。两个进程同时运行时(可能由不同的客户启动),就可以使用共享内存。在大多数情况下,共享内存比共享文件或数据库表的速度更快。在PHP中使用共享内存时,必须使用–enable–shmop参数编译。使用共享内存时,要求进程是持久的,如Apache模块、IIS ISAPI或PHP-GTK应用程序。例如在Linux下MySQL的命令:
使用ps aux | grep mysql
可以看到
/usr/local/mysql/libexec/mysqld --basedir=/usr/local/mysql --datadir=/data/mysql --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --skip-external-locking --socket=/data/mysql/mysql.sock
<?xml:namespace prefix = o />
对了,这里我要说一下MySQL的配置文件的位置,起初我有点懵,就是刚开始弄Linux的时候就没找到my.cnf
在unix环境下:
1. /etc/my.cnf
2. DATADIR/my.cnf
3. ~/.my.cnf
在Windows环境:
1. %SystemRoot%/my.ini
2. c:\my.cnf
Sock文件一般默认写在/tmp/mysql.sock 目录里面,也可以单个指定sock文件。在命令行下连接需要写参数
Mysql –uroot –h127.0.0.1 –p –S 跟sock文件路径。
二:解决函数:
Php其实有两套使用共享内存的函数(System V IPC、shmop)。
一套是System V IPC函数的封装,另一套是shmop。这两个都无需安装外部库文件。前者只能在Linux下使用,而且要使用它的话,在安装php的时候要加上–enable-sysvshm选项。而后者在linux和windows(win2k之后的系统,win98不支持)都可以使用,但在windows的时候,只有在php是ISAPI运行模式才能正常工作,在安装php的时候要加上–enable-shmop。
System V IPC 函数:
shm_attach():打开建立共享内存空间。
shm_detach():中止共享内存空间链接。
shm_remove():清除内存空间。
shm_put_var():加入或更新内存空间中的变量。
shm_get_var():取得内存空间中指定的变量。
shm_remove_var():删除内存空间中指定的变量。
Shmop 函数
shmop_open():打开或创建一个内存块来共享。
shmop_close():关闭一个共享内存块。
shmop_delete():删除一个共享内存块。
shmop_read():从一个共享内存块读取数据。
shmop_write():将数据写到一个共享内存块。
shmop_size():得到一个共享内存块的大小。
三:总结:
1. 这两套函数都是简单易用的,shmop的唯一好处是可以在windows下使用,在linux下的话推荐使用shm_*那套函数,因为那套函数在插入、更新以及读取共享内存里面的变量相当方便,而shmop需要自己来规划共享内存的存储结构,应用起来稍微复杂一点。
2. 在使用shmop时,如果使用完成后没有进行shmop_delete()操作,则下次对共享内存变量值的写入会有问题出现,如果前次写入的长度〉下次写入的长度,则只覆盖前面的,多余的内容保留。反之,如果前次写入的长度〈下次写入的长度,则多余的内容会自动追加到后面。
3. 共享内存时需要的key及变量均为int类型。
评论