首页 > PHP教程

php 不同服务器共享session问题

一、问题起源

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

阅读全文

PHP PDO 学习笔记


■PDO为何物?
POD(PHP Data Object)扩展在PHP5中加入,PHP6中将默认识用PDO连接数据库,所有非PDO扩展将会在PHP6被从扩展中移除。该扩展提供PHP内置类 PDO来对数据库进行访问,不同数据库使用相同的方法名,解决数据库连接不统一的问题。
我是配置在windows下做开发用的。
■PDO的目标

阅读全文

6条技巧减少你的php代码量

 PHP是一个很好的语言,而且有很多惊喜。而今天我看到了一个有趣的方法,在Arnold Daniels的博客。他谈到PHP中的临时变量。这个秘诀有益于"懒惰"的程序员,使程序员可以不用再去想该去给变量取个什么名字。他们可以使用这样的变量名:${0}

阅读全文

PHP 会话(session 时间设定)使用入门




在PHP开发中对比起Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用。

  由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。PHPChina 开源社区门户k%W%e2CY

   对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能 只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安全。

   而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。

  当然使用 Session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。

  Session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 php.ini 的权限,默认 Session 的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。

  开始介绍如何创建 Session。非常简单,真的。

  启动 Session 会话,并创建一个 $admin 变量:

<?php
// 启动 Session
session_start();
// 声明一个名为 admin 的变量,并赋空值。
$_SESSION["admin"] = null;
?>

  如果你使用了 Seesion,或者该 PHP 文件要调用 Session 变量,那么就必须在调用 Session 之前启动它,使用 session_start() 函数。其它都不需要你设置了,PHP 自动完成 Session 文件的创建。

  执行完这个程序后,我们可以到系统临时文件夹找到这个 Session 文件,一般文件名形如:sess_4c83638b3b0dbf65583181c2f89168ec,后面是 32 位编码后的随机字符串。用编辑器打开它,看一下它的内容:

  admin|N;

  一般该内容是这样的结构:

  变量名|类型:长度:值;

  并用分号隔开每个变量。有些是可以省略的,比如长度和类型。

  我们来看一下验证程序,假设数据库存储的是用户名和 md5 加密后的密码:

<?php

// 表单提交后...
$posts = $_POST;
// 清除一些空白符号
foreach ($posts as $key => $value)
{
$posts[$key] = trim($value);
}
$password = md5($posts["password"]);
$username = $posts["username"];

$query = "SELECT `username` FROM `user` WHERE `password` = ''$password''";
// 取得查询结果
$userInfo = $DB->getRow($query);

if (!empty($userInfo))
{
if ($userInfo["username"] == $username)
{
// 当验证通过后,启动 Session
session_start();
// 注册登陆成功的 admin 变量

阅读全文

去除html和php标记的方法--strip_tags




这个方法可去掉字符串中包含的任何 HTML 及 PHP 的标记字符串,例如:

 $str = "<html><body><table width=100 border=1><tr><td><img src=''qq-373461091.jpg''>文本内容</td></tr></table>< /body></html>";
 echo "1.".$str."<br>";
 echo "2.".strip_tags($str);

则第一个输出表格里的图片和文本内容,第二个则只输出文本内容“文本内容”,但若是字符串的 HTML 及 PHP 标签原来就有错,例如少了大于的符号,则也会返回错误

阅读全文

轻松搞定PHP5+apach2+mysql

有个美国客户要改个小网站,要我帮忙。只能拣起荒废多日的PHP,重新看看.

第一关就是配置. 配置这个破东西与JAVA环境一样难伺候..为什么标榜自由的东西,总是那么难搞呢???

阅读全文

PHP中使session可以跨窗口运行的方法

这本来是session的基本用法,但在php中就不灵了。不过我们可以把session变量注册成"跨窗口的全局变量"。但这有一个条件,就是要向需要使用该session变量的窗口发送变量名为session_name(),值为session_id()的变量,用表单或者在url后面用?带上都可以.并且在使用session变量的页面的一开始处调用session_start()。

阅读全文

使用WAMP5搭建Apache+MySQL+PHP环境

转贴:



目前有不少AMP(ApacheMySQLPHP)的集成软件,可以让我们一次安装并设置好。这对于不熟悉AMP的用户来说,好处多多。

一、使用AMP集成软件的优点:
1、可避免由于缺乏AMP的知识,而无法正确设置环境;
2、可快速安装并设置好AMP环境,让我们直接开始真正感兴趣的软件,如xoops;
3、可方便的搭建测试环境,对于测试“是AMP环境问题,还是XOOPS造成的问题”很有帮助,采用排除法即可。

二、常用的AMP集成软件:
1、AppServ:http://www.appservnetwork.com/
这个软件在台湾很流行。看到不少书籍也极力推荐,估计都是受台湾用户的影响。

2、XAMPP:http://www.apachefriends.org/en
这个软件支持多个平台,WinLinuxSolarisMac OS X,目前也有不少人使用。

3、WAMP5:http://www.wampserver.com/en/
这是我今天极力推荐的,绝对五星级。注意它的名字是带个5的哦,意思就是WAMP5使用最新的PHP5版本,正如官方网站上的口号:Discover PHP5 with WAMP5 ! 

三、根据我的经验,WAMP5有如下优点:
1、XOOPS在WAMP5中使用,没有任何问题。
2、WAMP5专注于Windows平台,安装设置及其简单。
3、PHP默认的是5.x版本,如果需要php4.x,只要安装php4.x插件,就可以在两者之间自由的切换,非常方便。
4、MySQL默认的是5.x版本,但可以通过选择老版本的WAMP5,从而使用4.x的MySQL。
5、可视化的菜单管理,极其方便。如,打开关闭php extention、Apache module等,直接通过菜单选择就可以。
6、还有各种插件,如ZEND OPTIMIZER ADD-ON等。
7、如果有疑问,官方还有论坛可以求助。
......更多优点:谁用谁知道,早用早知道^_^

阅读全文

详细讲解PHP的日期时间函数date()

导读:
  大写Y表示年四位数字,而小写y表示年的两位数字;
  小写m表示月份的数字(带前导),而小写n则表示不带前导的月份数字。
  echo date(''Y-M-j'');
  2007-Feb-6
  echo date(''Y-m-d'');
  2007-02-06
  大写M表示月份的3个缩写字符,而小写m则表示月份的数字(带前导0);
  没有大写的J,只有小写j表示月份的日期,无前导o;若需要月份带前导则使用小写d。
  echo date(''Y-M-j'');
  2007-Feb-6
  echo date(''Y-F-jS'');
  2007-February-6th
  大写M表示月份的3个缩写字符,而大写F表示月份的英文全写。(没有小写f)
  大写S表示日期的后缀,比如“st”、“nd”、“rd”和“th”,具体看日期数字为何。
  小结:
  表示年可以用大写的Y和小写y;
  表示月可以用大写F、大写M、小写m和小写n(分别表示字符和数字的两种方式);
  表示日可以用小写d和小写j,大写S表示日期的后缀。
  2,时:分:秒
  默认情况下,PHP解释显示的时间为“格林威治标准时间”,与我们本地的时间相差8个小时。
  echo date(''g:i:s a'');
  5:56:57 am
  echo date(''h:i:s A'');
  05:56:57 AM
  小写g表示12小时制,无前导0,而小写h则表示有前导0的12小时制。
  当使用12小时制时需要表明上下午,小写a表示小写的“am”和“pm”,大写A表示大写的“AM”和“PM”。
  echo date(''G:i:s'');
  14:02:26
  大写G表示24小时制的小时数,但是不带前导的;使用大写的H表示带前导的24小时制小时数
  小结:
  字母g表示小时不带前导,字母h表示小时带前导;
  小写g、h表示12小时制,大写G、H表示24小时制。
  3,闰年、星期、天
  echo date(''L'');
  今年是否闰年:0
  echo date(''l'');
  今天是:Tuesday
  echo date(''D'');
  今天是:Tue
  大写L表示判断今年是否闰年,布尔值,为真返回1,否则为0;
  小写l表示当天是星期几的英文全写(Tuesday);
  而使用大写D表示星期几的3个字符缩写(Tue)。
  echo date(''w'');
  今天星期:2
  echo date(''W'');
  本周是全年中的第 06 周
  小写w表示星期几,数字形式表示
  大写W表示一年中的星期数
  echo date(''t'');
  本月是 28 天
  echo date(''z'');
  今天是今年的第 36 天
  小写t表示当前月份又多少天
  小写z表示今天是本年中第几天
  4,其他
  echo date(''T'');
  UTC
  大写T表示服务器的时间区域设置
  echo date(''I'');
  0
  大写I表示判断当前是否为夏令时,为真返回1,否则为0
  echo date(''U'');
  1170769424
  大写U表示从1970年1月1日到现在的总秒数,就是Unix时间纪元的UNIX时间戳。
  echo date(''c'');
  2007-02-06T14:24:43+00:00
  小写c表示ISO8601日期,日期格式为YYYY-MM-DD,用字母T来间隔日期和时间,时间格式为HH:MM:SS,时区使用格林威治标准时间(GMT)的偏差来表示。
  echo date(''r'');
  Tue, 06 Feb 2007 14:25:52 +0000
  小写r表示RFC822日期。
  小小的date()函数就显示出了PHP的强大功能和迷人魅力,再比较下ASP,呵呵。

阅读全文