Rootop 服务器运维与web架构

2011-03-17
发表者 Venus
暂无评论

PHP实现多web服务器共享SESSION数据-session数据写入mysql数据库

PHP实现多web服务器共享SESSION数据(session数据写入mysql数据库)

  一、问题起源

  稍大一些的网站,通常都会有好几个服务器,每个服务器运行着不同功能的模块,使用不同的二级域名,而一个整体性强的网站,用户系统是统一的,即一套用户名、密码在整个网站的各个模块中都是可以登录使用的。各个服务器共享用户数据是比较容易实现的,只需要在后端放个数据库服务器,各个服务器通过统一接口对用户数据进行访问即可。但还存在一个问题,就是用户在这个服务器登录之后,进入另一个服务器的别的模块时,仍然需要重新登录,这就是一次登录,全部通行的问题,映射到技术上,其实就是各个服务器之间如何实现共享 SESSION 数据的问题。

  二、PHP SESSION 的工作原理

  在解决问题之前,先来了解一下 PHP SESSION 的工作原理。在客户端(如浏览器)登录网站时,被访问的 PHP 页面可以使用 session_start() 打开 SESSION,这样就会产生客户端的唯一标识 SESSION ID(此 ID 可通过函数 session_id() 获取/设置)。SESSION ID 可以通过两种方式保留在客户端,使得请求不同的页面时,PHP 程序可以获知客户端的 SESSION ID;一种是将 SESSION ID 自动加入到 GET 的 URL 中(这个只能在unix系统下能实现,windows系统不能实现自动加入url中),或者 POST 的表单中,默认情况下,变量名为 PHPSESSID;另一种是通过 COOKIE,将 SESSION ID 保存在 COOKIE 中,默认情况下,这个 COOKIE 的名字为 PHPSESSID。这里我们主要以 COOKIE 方式进行说明,因为应用比较广泛。

  那么 SESSION 的数据保存在哪里呢?当然是在服务器端,但不是保存在内存中,而是保存在文件或数据库中。默认情况下,php.ini 中设置的 SESSION 保存方式是

  files(session.save_handler = files),即使用读写文件的方式保存 SESSION 数据,而 SESSION 文件保存的目录由 session.save_path 指定,文件名以

  sess_ 为前缀,后跟 SESSION ID,如:sess_c72665af28a8b14c0fe11afe3b59b51b。文件中的数据即是序列化之后的 SESSION 数据了。如果访问量大,可能产生的

  SESSION 文件会比较多,这时可以设置分级目录进行 SESSION 文件的保存,效率会提高很多,设置方法为:session.save_path=”N;/save_path”,N 为分级的级数

  ,save_path 为开始目录。当写入 SESSION 数据的时候,PHP 会获取到客户端的 SESSION_ID,然后根据这个 SESSION ID 到指定的 SESSION 文件保存目录中找到

  相应的 SESSION 文件,不存在则创建之,最后将数据序列化之后写入文件。读取 SESSION 数据是也是类似的操作流程,对读出来的数据需要进行解序列化,生成相应

  的 SESSION 变量。

  三、多服务器共享SESSION 的主要障碍及解决办法

  通过了解 SESSION 的工作原理,我们可以发现,在默认情况下,各个服务器会各自分别对同一个客户端产生SESSION ID,如对于同一个用户浏览器,A 服务器产生的 SESSION ID 是 30de1e9de3192ba6ce2992d27a1b6a0a,而 B 服务器生成的则是c72665af28a8b14c0fe11afe3b59b51b。另外,PHP 的 SESSION 数据都是分别保存在本服务器的文件系统中。

  确定了问题所在之后,就可以着手进行解决了。想要共享 SESSION 数据,那就必须实现两个目标:

  一个是各个服务器对同一个客户端产生的 SESSION ID 必须相同,并且可通过同一个 COOKIE 进行传递,也就是说各个服务器必须可以读取同一个名为 PHPSESSID 的 COOKIE;

  另一个是 SESSION 数据的存储方式/位置必须保证各个服务器都能够访问到。 简单地说就是多服务器共享客户端的 SESSION ID,同时还必须共享服务器端的SESSION数据。

  第一个目标的实现其实很简单,只需要对 COOKIE 的域(domain)进行特殊地设置即可,默认情况下,COOKIE 的域是当前服务器的域名/IP 地址,而域不同的话,各个服务器所设置的 COOKIE 是不能相互访问的。

2011-03-17
发表者 Venus
暂无评论

linux 下的ps命令参数

%CPU 进程的cpu占用率
%MEM 进程的内存占用率
VSZ 进程所使用的虚存的大小
RSS 进程使用的驻留集大小或者是实际内存的大小
TTY 与进程关联的终端(tty)
STAT 检查的状态:进程状态使用字符表示的,如R(running正在运行或准备运行)、S(sleeping睡眠)、I(idle空闲)、Z (僵死)、D(不可中断的睡眠,通常是I/O)、P(等待交换页)、W(换出,表示当前页面不在内存)、N(低优先级任务)T(terminate终止)、W has no resident pages

START (进程启动时间和日期)
TIME ;(进程使用的总cpu时间)
COMMAND (正在执行的命令行命令)
NI (nice)优先级
PRI 进程优先级编号
PPID 父进程的进程ID(parent process id)
SID 会话ID(session id)
WCHAN 进程正在睡眠的内核函数名称;该函数的名称是从/root/system.map文件中获得的。
FLAGS 与进程相关的数字标识

常用参数
-A 显示所有进程(等价于-e)(utility)
-a 显示一个终端的所有进程,除了会话引线
-N 忽略选择。
-d 显示所有进程,但省略所有的会话引线(utility)
-x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)
-p pid 进程使用cpu的时间
-u uid or username 选择有效的用户id或者是用户名
-g gid or groupname 显示组的所有进程。
U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)
-f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.
-l 长格式(有F,wchan,C 等字段)
-j 作业格式
-o 用户自定义格式。
v 以虚拟存储器格式显示
s 以信号格式显示
-m 显示所有的线程
-H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)
e 命令之后显示环境(如:ps -d e; ps -a e)(utility)
h 不显示第一行

2011-03-17
发表者 Venus
暂无评论

Linux 任务计划 crond 命令用法

crond 是Linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分钟会定期检查是否有要执行的工作,如果有 要执行的工作便会自动执行该工作。而Linux任务调度的工作主要分为以下两类:

  1、系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存

  2、个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是 否有新信,这些工作可由每个用户自行设置

  Crontab是UNIX系统下的定时任务触发器,其使用者的权限记载在下列两个 文件中:

  文件 含义

  /etc/cron.deny 该文件中所列的用户不允许使用Crontab命令

  /etc/cron.allow 该文件中所列的用户允许使用Crontab命令

  /var/spool/cron/ 是所有用户的crontab文件

  /var/spool/cron/crontabs /var/spool/cron/crontabs

  Crontab命令的格式为:crontab –l|-r|-e|-i [username],其参数含义如表一:

  参数名称 含义 示例

  -l 显示用户的Crontab文件的内容 crontabl –l

  -i 删除用户的Crontab文件前给提示 crontabl -ri

  -r 从Crontab目录中删除用户的Crontab文件 crontabl -r

  -e 编辑用户的Crontab文件 crontabl -e

  用户所建立的Crontab文件存于/var/spool/cron中,其文件名 与用户名一致。

  它的格式共分为六段,前五段为时间设定段,第六段为所要执行的命令段,

  格式如下:* * * * * <command>

  其时间段的含义如表二:

  段 含义 取值范围

  第一段 代表分钟 0—59

  第二段 代表小时 0—23

  第三段 代表日期 1—31

  第四段 代表月份 1—12

  第五段 代表星期几,0代表星期日 0—6

 例:如果用户的Crontab文件的内容是:29 19 * * * echo its dinner time,则系统每天的19:29显示‘its dinner time’

  示例(创建一个cron全过程,每分钟都会在test.txt里输入当前时间):

  1. 以普通用户登录linux系统(我用的是CentOS4.1)

  2. $crontab –e

  说明:系统默认的编辑器是VIM,如果不是请加上以下shell:

  $EDITOR=vi

  $export EDITOR

  3. 输入”*/1 * * * * date >> $HOME/test.txt”,save and exit VIM

  4. $su root

  5. $cd /etc/init.d

  6. ./crond restart

  下面看看看几个具体的例子:

  ● 0 */2 * * * /sbin/service httpd restart 意思是每两个小时重启一次apache

  ● 50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务

  ● 50 22 * * * /sbin/service sshd stop 意思是每天22:50关闭ssh服务

  ● 0 0 1,15 * * fsck /home 每月1号和15号检查/home 磁盘

  ● 1 * * * * /home/bruce/backup 每小时的第一分执行 /home/bruce/backup这个文件

  ● 00 03 * * 1-5 find /home “*.xxx” -mtime 4 -exec rm {} \; 每周一至周五3点钟,在目录/home中,查找文件名为*.xxx的文件,并删除4天前的文件。

  ● 30 6 */10 * * ls 意思是每月的1、11、21、31日是的6:30执行一次ls命令。

          * 1 * * * /usr/sbin/ntpdate 192.168.10.10   每天晚上1点,与192.168.10.10 进行时间同步

2011-03-17
发表者 Venus
暂无评论

linux中自动运行的配置文件

1/etc/profile :在系统加载的时候运行,不需要登录
2/.bash_profile:用户登录系统的时候自动运行
3/.bashrc :登录的时候自动运行,但当用户打开了一个终端后也自动运行。
4/.bash_logout:用户注销的时候运行。

2011-03-17
发表者 Venus
暂无评论

RedHat AS5 PHP添加JSON模块

php安装json模块 RedHat、Centos
yum install php-devel
yum install php-pear
yum install gcc
pecl自动编译安装:
pecl install json    (联网操作)
去/usr/lib64/php/modules/下看看有没有json.so文件,有说明安装成功,接着配置php.ini加载 (本机器为64位系统,所以是lib64)

添加一行: extension=json.so
保存退出。

service httpd restart
查看是否安装成功
echo “<? phpinfo(); ?>”  > /var/www/html/phpinfo.php

看到json为enabled即可

补充:

源码编译方式 (32位系统)                                                                                                        到 http://pecl.php.net/package/json 上下载json,之后编译安装即可。

[root@dot5 json-1.2.1]# make install
Installing shared extensions:     /usr/lib/php/modules/
[root@dot5 json-1.2.1]# cd /usr/lib/php/modules/
[root@dot5 modules]# ll
总计 444
-rwxr-xr-x 1 root root  28200 2010-01-15 dbase.so
-rwxr-xr-x 1 root root  76130 04-11 19:02 json.so
-rwxr-xr-x 1 root root 106188 2010-01-15 mysqli.so
-rwxr-xr-x 1 root root  48996 2010-01-15 mysql.so
-rwxr-xr-x 1 root root  23692 2010-01-15 pdo_mysql.so
-rwxr-xr-x 1 root root  82516 2010-01-15 pdo.so
-rwxr-xr-x 1 root root  19948 2010-01-15 pdo_sqlite.so
-rwxr-xr-x 1 root root  13036 2010-02-25 phpcups.so