浅析php中session和cookie的区别和联系

 更新时间:2016年11月25日 15:46  点击:1512
在php中session和cookie其实是没什么关系了,但是区别还是很大的,下面我来给各位同学介绍session和cookie的区别和联系.


首先谈谈cookie吧,百度百科是这样定义的:是网站为了辨别用户身份、进行session跟踪而存储在用户本地终端上的数据(通常经过加密)。

    php中生成一个cookie的方法很简单:setcookie(name, value, expire, path, domain);

    name:cookie中定义的名字。

    value:cookie中对name所保存的值。这个值保存在了用户的终端;不要保存敏感信息(个人重要信息,金钱)。

    expire:cookie中名值对保存的过期时间,这个值是以时间戳的形式保存下来的。

    path:cookie值保存的有效路径,如果设置成 ‘/’ 那么对整个项目都有效,如果设置成 ‘/foo/’ 那么cookie的有效路径在foo以及其下属文件,如果没有做任何设置那么他的有效路径是当前文件夹。

    domian:cookie可用的域名范围。

<?php
setcookie('site_name', 'IT博客');//设置一个cookie:site_name他的值是IT博客,这样就建立了一个会话,不过这个cookie保存在了内存中随着浏览器的关闭而销毁。
setcookie('site_name', 'IT博客', time() + 86400);//设置cookie并将他的过期时间设置为一天后,这样的会话会将cookie的值保存到硬盘中,关闭浏览器,一天内cookie在浏览器打开的时候还是有效的。
?>     写到这里想起了以前同事在项目中遇到的问题:比如我有一个功能用户浏览的前10个页面我要在页面中显示用于提示用户浏览过的页面,这里面就用到了cookie,用户浏览的页面大于10个之后会做分割只取前10个,array_slice可以帮到你,array_slice切割完之后cookie中保存的页面信息是不是减少了呢?可能会有这个疑问。带着这个疑问咱们说说cookie的销毁方式吧。

    cookie销毁方式一:将cookie值设置为空。

<?php
setcookie('site_name', '');
?> cookie销毁方式二:将cookie值设置为过期时间。

<?php
setcookie('site_name', 'IT博客', time() - 86400);
?>     看到这里你说array_slice会不会切割cookie中的值,使cookie的值减少呢?

    下面说一说session:session是一种服务器的机制,服务器使用一种类似于散列表的结构来保存信息,每一个网站的访客都会被赋予一个唯一的标识符进行识别(回话ID)。他的存放形式有两种:1是url传递,2是cookie保存。


    php中常用的session的函数中最重要的就是session_start(),没有开启session的话一切都免谈。


    php.ini中也有一些session的设置比如:


    session.save_handler = files —— session的保存形式以文件形式保存。

    session.save_path = “N;/path” ——— session文件的保存路径,这个路径需要自己创建且有写入的权限。其中N;/path中的N必须是一个整数这样可以使session文件保存在不同的目录中,这对于服务器处理大量的session文件是有帮助的。

    session和cookie的区别:


    1.session保存在服务器端,通过session.save_path可以设置session文件在服务器的位置。

    2.cookie保存在客户端,分为临时会话(关闭浏览器则销毁,保存在内存)、持久性会话(在有效期内一直可以调用,保存在硬盘上)。


    3.session相对cookie要安全一些,不过大量的session也会导致服务器的压力。


    session和cookie的联系:


    session的有效执行有两种方式:一是与cookie进行交互,二是通过url传递。


 ps:sessionid是一个很有用有时候也会导致问题的一个标识,有一次通过ajax发送50多个请求通过socket请求数据,在php端socket返回数据有时候会比较慢,虽然ajax是异步的请求但是在php端就不一样了,先来的会把后来的请求堵在后面,其中的标识符就是sessionid,由于这个sessionid导致了php端的顺序处理增加了用户的等待时间,致使用户体验较差。其中的解决方案是用session_write_close()断开sessionid的链接。

本文章来给大家介绍我常用的一些邮箱email tel等格式的正则表达式,各位有需要了解学习的朋友不防进入参考。

1.email验证函数

 代码如下 复制代码

function isValidEmail($email) { 

    $email = strtolower($email);
    if (!preg_match(“/[^@]{1,64}@[^@]{1,255}/”, $email)) { 
        return false; 
    } 
    $email_array = explode(“@”, $email); 
    $local_array = explode(“.”, $email_array[0]); 
    $length = sizeof($local_array); 
    for ($i = 0; $i < $length; $i++) { 
        if (!preg_match(“@^[a-z0-9_~-][a-z0-9_~.-]{0,63}$@”, $local_array[$i])) { 
            return false; 
        } 
    } 
    unset($length); 
    if (!preg_match(“@^[?[0-9.]+]?$@”, $email_array[1])) { 

        $domain_array = explode(“.”, $email_array[1]); 

        $length = sizeof($domain_array); 
        if ($length < 2) { 
            return false; 
        } 
        for ($i = 0; $i < $length; $i++) { 
            if (!preg_match(“/^(([a-z0-9][a-z0-9-]{0,61}[a-z0-9])|([a-z0-9]+))$/”, $domain_array[$i])) { 
                return false; 
            } 
        } 
    unset($length); 
    } 
    return true; 
}


2.验证移动电话是否符合规范

 代码如下 复制代码

function isValidCellPhone($cellPhone) { 

    $flag = FALSE; 

    if (preg_match(‘@^1[3458][0-9]{9}$@’, $cellPhone)) { 

        $flag = TRUE; 

    } 

    return $flag; 

3.验证电话是否符合规范 

 代码如下 复制代码

function isValidPhone($phone) { 

    if (preg_match(‘@^1[3458][0-9]{9}$@’, $phone)) { 

        return true; 

    } 

    if (preg_match(‘@((?:(?:(?:00860?|0)(?:10|2d|[3-9]dd))-?)?([2-8]d{6,7}))@’, $phone)){ 

        return true; 

    } 

    if (preg_match(‘@^([48]00(?:d{7}|-d{7}|-d{3}-d{4}|-d{4}-d{3}|d-d{3}-d{3}))$@’, $phone)) { 

        return true; 

    } 

    return false; 

}

可能有很多朋友都会碰到自己在使用一些工具时提示php_curl扩展模块无法加载,在phpmyadmin中碰到最多了,下面我来介绍一些解决办法。

apache 中php_curl不能加载

提示错误Fatal error:Call to undefined function curl_init()。我估计应该有人也有类似问题,赶紧百度一下,果然好多人遇到这个问题

1、将PHP安装目录中找libeay32.dll,ssleay32.dll,php_curl.dll,php5ts.dll四个DLL文件,有的在ext目录,找到后将他们复制到system32下,如果找不到请下载对应版本的PHP复制过去;

2、检查php.exe, php5ts.dll和php_curl.dll的版本是否相同,把鼠标放到什么就会显示版本信息;

3、打开你的php.ini文件,不知道在哪个位置的可以先phpinfo查看第六行显示路径,不要搞混了,打开做如下修改:将php_curl前的注释符(也就是分号)去掉。有必要的话将cgi.force_redirect前的注释符也去掉,并把值1修改为0;

4、重启IIS或apache后运行phpinfo检查curl是否成功加载,Ctrl+F查找curl,如果没有匹配,那肯定是没有加载成功,如果有匹配,恭喜你已经成功加载了。

具体解决办法

在php.ini中找到有extension=php_curl.dll, 去掉前面的注释.
设置extension_dir=c:phpext, 刷新PHP页面时报错, 说找不到模块php_curl.dll.
拷贝php_curl.dll 到windowssystem32,还是同样的错.
在网上找了一下,需要将:

libeay32.dll, ssleay32.dll, php5ts.dll, php_curl.dll

都拷贝到system32目录下,重启apache即可.

 


附上iis php_curl不能使用


问题:

PHP 在 IIS6 或 IIS7 中无法加载 php_curl.dll 动态链接库。
 
解决方法:

在PHP手册中有相关说明:php_curl.dll;CURL,客户端 URL 库函数库;需要:libeay32.dll,ssleay32.dll(已附带)
所以只要将 libeay32.dll,ssleay32.dll 这两个库复制到 %WINDOWS% 目录下即可。

获取客户端IP地址我们最简单的办法就是直接使用REMOTE_ADDR但这种如果有代理IP就无法获取了,所以我们要使用HTTP_X_FORWARDED_FOR来获取,下面我来给大家介绍一个获取IP地址函数

最简单的做法

 代码如下 复制代码


function getRealIpAddr()
{
  if (!emptyempty($_SERVER['HTTP_CLIENT_IP']))
  {
    $ip=$_SERVER['HTTP_CLIENT_IP'];
  }
  elseif (!emptyempty($_SERVER['HTTP_X_FORWARDED_FOR']))
  //to check ip is pass from proxy
  {
    $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
  }
  else
  {
    $ip=$_SERVER['REMOTE_ADDR'];
  }
  return $ip;
}


这个我自己写的

 

 代码如下 复制代码
<?php
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
  $onlineip = getenv('HTTP_CLIENT_IP');
 } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
  $onlineip = getenv('HTTP_X_FORWARDED_FOR');
 } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
  $onlineip = getenv('REMOTE_ADDR');
 } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
  $onlineip = $_SERVER['REMOTE_ADDR'];
 }
echo $onlineip;
?>

但感觉不怎么样,后来百度找到了一个

实例

 代码如下 复制代码

function real_ip() {
 static $realip = NULL;

 if ($realip !== NULL)  {
  return $realip;
 }

 if (isset($_SERVER)) {
  if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
   $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);

   /* 取X-Forwarded-For中第一个非unknown的有效IP字符串 */
   foreach ($arr AS $ip) {
    $ip = trim($ip);

    if ($ip != 'unknown') {
     $realip = $ip;
     break;
    }
   }
  } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
   $realip = $_SERVER['HTTP_CLIENT_IP'];
  } else {
   if (isset($_SERVER['REMOTE_ADDR'])) {
    $realip = $_SERVER['REMOTE_ADDR'];
   } else {
    $realip = '0.0.0.0';
   }
  }
 } else {
  if (getenv('HTTP_X_FORWARDED_FOR')) {
   $realip = getenv('HTTP_X_FORWARDED_FOR');
  } elseif (getenv('HTTP_CLIENT_IP')) {
   $realip = getenv('HTTP_CLIENT_IP');
  } else {
   $realip = getenv('REMOTE_ADDR');
  }
 }

 preg_match("/[d.]{7,15}/", $realip, $onlineip);
 $realip = !empty($onlineip[0]) ? $onlineip[0] : '0.0.0.0';

 return $realip;
}

今天我有几千个文件要一次修改文件或把后缀名给改了,但是我要手工一个个去改,不得改几天后来想到一个办法,利用php写一个量修改文件名/文件后缀名程序,一下就实现了,下面来看看方法。

几个关键的函数。

is_dir($dirname)      //判断一个文件名是否 为目录
opendir($dirname)      //打开一个文件夹
readdir($dir_stream)   //函数返回由 opendir() 打开的目录句柄中的条目
pathinfo($path)        //函数以数组的形式返回文件路径的信息。
例如当前文件夹下的P1010436


例如当前文件夹下的P1010436.jpg文件路径信息数组:

Array
(
    [dirname] => .
    [basename] => P1010436.jpg
    [extension] => jpg
    [filename] => P1010436
)
rename(oldname,newname,context) //函数重命名文件或目录。若成功,则该函数返回 true。若失败,则返回 false。

 代码如下 复制代码

 

<?php
function fileRename($dir,$srcExtension,$desExtension){
 if(!is_dir($dir)){
  echo "{$dir}不是一个有效的目录!n";
  exit();  
  }
 $handler = opendir($dir);
 //列出$dir目录中的所有文件
 while(($fileName = readdir($handler))!=false){
  if($fileName!='.'&&$fileName!='..'){
   //'.' 和 '..'是分别指向当前目录和上级目录
   $curDir = $dir.'/'.$fileName;
   if(is_dir($curDir)){
    //如果是目录,则递归下去
    fileRename($curDir,$srcExtension,$desExtension);
    }
    else{
     //获取文件路径的信息
     $path = pathinfo($curDir);
     //print_r($path);
     if($path['extension']==$srcExtension){  
      $newname = $path['dirname'].'/'
      .$path['filename'].".".$desExtension;
      rename($curDir,$newname);   
      echo $curDir.'-->'.$newname."n";   
      }
     }
   }
  }
 }
fileRename(".","JPG","jpg");
?>


使用方法很简单,我们把图片与php文件同一目录然后再运行php即可。

[!--infotagslink--]

相关文章

  • mysql_connect与mysql_pconnect的区别详解

    在mysql中我们会看到有两种常用的数据库连接模式,一种是长久连接,另一各是页面访问完之后就断了连接,下面我来分别介绍mysql_connect与mysql_pconnect的区别,有需要了解...2016-11-25
  • phpems SQL注入(cookies)分析研究

    PHPEMS(PHP Exam Management System)在线模拟考试系统基于PHP+Mysql开发,主要用于搭建模拟考试平台,支持多种题型和展现方式,是国内首款支持题冒题和自动评分与教师评分相...2016-11-25
  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • C#中out与ref的区别实例解析

    这篇文章主要介绍了C#中out与ref的区别实例解析,对C#初学者有不错的学习借鉴价值,需要的朋友可以参考下...2020-06-25
  • PHP中func_get_args(),func_get_arg(),func_num_args()的区别

    复制代码 代码如下:<?php function jb51(){ print_r(func_get_args()); echo "<br>"; echo func_get_arg(1); echo "<br>"; echo func_num_args(); } jb51("www","j...2013-10-04
  • 谈谈Jquery中的children find 的区别有哪些

    精华:find方法能找子孙,children方法只能找儿子一、Jquery中children 语法.children(selector) 说明expr是表达式,可选参数,所有选择器中的表达式都可以用在这,比如按标签名"div",按类名".class",按序号":first"等等,如果表...2015-10-21
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • vue项目中js-cookie的使用存储token操作

    这篇文章主要介绍了vue项目中js-cookie的使用存储token操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-11-14
  • 详解C#中的session用法

    这篇文章主要介绍了C#中的session用法 ,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Python3使用Selenium获取session和token方法详解

    这篇文章主要介绍了Python3使用Selenium获取session和token方法详解,需要的朋友可以参考下...2021-02-17
  • PS中像素大小、文档大小的区别

    在PS中像素大小、文档大小有什么区别呢,这个估计很多初学者不清楚,下面我来给大家讲解一下,希望对你有帮助。 1、像素大小 通常用于显示屏显示的图片大小的调整。菜...2016-09-14
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • C#中sleep和wait的区别分析

    这篇文章主要介绍了C#中sleep和wait的区别分析,有助于深入理解C#中线程的原理与使用技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
  • 编程新手必须掌握的:session与cookie的区别

    session和cookie是网站浏览中较为常见的两个概念,也是比较难以辨析的两个概念,但它们在点击流及基于用户浏览行为的网站分析中却相当关键。基于网上一些文章和资料的参阅,及作者个人的应用体会,对这两个概念做一个简单的阐述...2013-09-11
  • python爬虫用request库处理cookie的实例讲解

    在本篇内容里小编给大家整理的是一篇关于python爬虫用request库处理cookie的实例讲解内容,有需要的朋友们可以学习参考下。...2021-02-21
  • uniapp和vue的区别详解

    这篇文章主要介绍了uniapp和vue的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-10-19
  • PHP中如何使用session实现保存用户登录信息

    session在php中是一个非常重要的东西,像我们用户登录一般都使用到session这个东西,相对于cookie来说session 要安全很多,同时我们购物车经常使用session来做临时的记录保存哦。使用session保存页面登录信息1、数据库连接...2015-10-21