php不同子域的同名cookie问题解决方法

 更新时间:2016年11月25日 17:38  点击:2193
$_COOKIE是php中一个非常好用的东西,但是有时我们会碰到同域名下的不同子域名一样,这样就会存在只能保留一个cookie的问题,下面小编来给各位同学介绍一下。

PHP的超全局变量$_COOKIE带来了很多便利,在某些情况下也会造成困惑。比如在根域和子域下存在同名cookie,$_COOKIE中只能保存一个,应该是哪个?

RFC建议使用长度最长的那个,这样精度最高,但是不同浏览器处理方式不同。我只测试了Chrome,Chrome中根域和子域的同名cookie都发送出去了,这样PHP只接收排在前面的同名cookie,后面的被忽略,这样很容易接收到错误的值。据说Safari遵循了RFC的建议,没有亲自测试,其他浏览器也没有测试。


首先通过SwitchHosts设定虚拟域名:www.111cn.net,并且配置好Web服务器,当然,你手动设置Hosts文件也可以,我本意是为了多介绍几个工具。

然后编写设置Cookie的PHP脚本,先设置子域,再设置根域:

 代码如下 复制代码

<?php
setcookie("bar", "www", time() + 10, "/", "www.111cn.net");
setcookie("bar", "foo", time() + 10, "/", ".111cn.net");
?>

再编写浏览Cookie的脚本:

 代码如下 复制代码

<?php
var_dump($_COOKIE);
?>

BTW:最初写脚本的时候我竟然在setcookie前使用了var_dump,也就是在发送请求头之前有了输出,犯了这样的初学者错误实在是罪过,可更令人惊讶的是脚本没有报错,查了半天原来是因为php.ini里缺省output_buffering = 4096。

先设置再浏览,就能看到结果了,结果显示有效的是子域下的Cookie。

重开一个浏览器窗口,并使用WebDeveloper删除Cookie,或手动删除,避免对结果造成影响。

然后调换两次调用setcookie的顺序,也就是先设置根域,再设置子域:

 代码如下 复制代码

<?php
setcookie("bar", "foo", time() + 10, "/", ".111cn.net");
setcookie("bar", "www", time() + 10, "/", "www.111cn.net");
?>

先设置再浏览,就能看到结果了,结果显示有效的是根域下的Cookie。

重复两次测试过程,并用Firebug记录下请求头的差异:

第一次先设置子域,再设置根域:请求头Cookie的值是bar=www;bar=foo,结果有效的是bar=www
第二次先设置根域,再设置子域:请求头Cookie的值是bar=foo;bar=www,结果有效的是bar=foo

也就说,同名Cookie对于服务端PHP来说,在请求头Cookie中,哪个在前哪个生效,后面的会被忽略。

如果使用的不是Firefox,那就用不了Firebug,此时可以用PHP代码来检测Cookie头:

 代码如下 复制代码

if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']);

以上的实验结论是基于Firefox而言的,由于不同的浏览器发送Cookie的策略可能有差异,所以在其他浏览器上结果可能会有所不同,比如在Safari下就始终是子域有效,其他浏览器如Opera,Chrome等未仔细测试。鉴于这个混乱的结论,所以还是不要在子域和根域下使用同名Cookie为好!

结论:目前在根域和子域中使用同名COOKIE是非常不明智的

今天起看发现服务器的nginx产生大量日志了,并且提示PHP Warning: Memcache::connect(): Can\'t connect to 127.0.0.1:11211, Connection timed out (110) in,后来几经周折找出问题所在了。

在一次例行检查日志的时候,发现Nginx日志中出现了大量的PHP连接Memcached超时的报错信息,如下:

PHP Warning: Memcache::connect(): Can't connect to 127.0.0.1:11211, Connection timed out (110) in ...

连上服务器检查Memcached进程运行正常,然后我用一段测试代码检查Memcached是否能够正常连接,结果也很正常。

于是又仔细分析日志,发现那段报错信息是间隔出现的,说明是有一定几率的。这时我回想起上周因为架构问题刚刚把PHP的Session存储路径指向到了Memcached里,可能是因为这个配置增加了Memcached的负载,从而导致在并发量较高时,Memcached出现连接超时的现象。

找到原因就容易解决了。重新调整Memcached的启动参数,增加-c参数来提高连接数量。默认为1024,可以逐步增加以找到最佳数值。我设置为2048。

启动命令为:

 代码如下 复制代码

memcached -d -m 256 -c 2048 -l 127.0.0.1 -p 11211 -u root

如果服务器充裕,可以考虑分布式的memcached集群,以降低单个节点上的压力,据说2.5有连接数量过多导致oom的bug

文章来给大家介绍php foreach循环中使用引用问题分析与注意事项,希望此文章对各位同学会有所帮助。


 代码如下 复制代码

<?php
$array=array('a','b','c','d');
foreach($array as $key=>$val){
    //do something
}
echo $val;//输出d
echo $kay;//输出3
$val='e';
print_r($array);//输出Array ( [0] => a [1] => b [2] => c [3] => d )
?>

在foreach循环中,当循环结束后,$key和$val变量都不会自动释放掉。值会被保留下来。

当foreach使用引用的情况下,会出现如下的情况,需要注意。

 代码如下 复制代码

<?php
$array=array('a','b','c','d');
foreach($array as $key=>&$val){//使用引用
    //do something
}
echo $val;//输出d
echo $kay;//输出3
$val='e';
print_r($array);//输出Array ( [0] => a [1] => b [2] => c [3] => e )
?>

当$val变量使用&引用后,当执行foreach循环结束后,$val指向了和$arrar[3]相同的内存地址。
当foreach循环结束后$val变量还是存在的,所以在foreach循环结束后改变$val的值,就相当于改变了$arrar[3]的值。

本文章来给大家介绍php htmlentities汉字乱码问题解决办法,其实我们只要把接受数据转换成uft8即可解决汉字乱码了。

htmlentities函数作用在汉字变量中的时候会出现乱码

 代码如下 复制代码
$resultsText = str_replace("[QUERY]", htmlentities($query), $resultsText);

正确的做法是改变htmlentities的默认参数

htmlentities($query,ENT_COMPAT,'UTF-8')

 代码如下 复制代码

<?php
    $query='你好';
    $resultsText='1 条与 "[QUERY]" 相关的搜索结果';
    $resultsText = str_replace("[QUERY]", htmlentities($query,ENT_COMPAT,'UTF-8'), $resultsText);
    header('content-type: text/html; charset=utf-8');
 
    print_r($resultsText);
?>

本文章来给各位同学介绍一下关于php中fgetcsv函数在php5.2.8 中的数据不完整问题解决办法,希望此文章对各位朋友会有所帮助。

问题解析出来的数据不完整,有为空的字段
网上查了下说是在php5.2.8 中存在bug
解决办法是使用自定义函数

 代码如下 复制代码

function __fgetcsv(& $handle, $length = null, $d = ',', $e = '"') {
     $d = preg_quote($d);
     $e = preg_quote($e);
     $_line = "";
     $eof=false;
     while ($eof != true) {
         $_line .= (empty ($length) ? fgets($handle) : fgets($handle, $length));
         $itemcnt = preg_match_all('/' . $e . '/', $_line, $dummy);
         if ($itemcnt % 2 == 0)
             $eof = true;
     }
     $_csv_line = preg_replace('/(?: |[ ])?$/', $d, trim($_line));
     $_csv_pattern = '/(' . $e . '[^' . $e . ']*(?:' . $e . $e . '[^' . $e . ']*)*' . $e . '|[^' . $d . ']*)' . $d . '/';
     preg_match_all($_csv_pattern, $_csv_line, $_csv_matches);
     $_csv_data = $_csv_matches[1];
     for ($_csv_i = 0; $_csv_i < count($_csv_data); $_csv_i++) {
         $_csv_data[$_csv_i] = preg_replace('/^' . $e . '(.*)' . $e . '$/s', '$1' , $_csv_data[$_csv_i]);
         $_csv_data[$_csv_i] = str_replace($e . $e, $e, $_csv_data[$_csv_i]);
     }
     return empty ($_line) ? false : $_csv_data;
}

[!--infotagslink--]

相关文章

  • phpems SQL注入(cookies)分析研究

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

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • JS使用cookie实现DIV提示框只显示一次的方法

    本文实例讲述了JS使用cookie实现DIV提示框只显示一次的方法。分享给大家供大家参考,具体如下:这里运用JavaScript的cookie技术,控制网页上的提示DIV只显示一次,也就是当用户是第一次打开网页的时候才显示,第二次自动隐藏起...2015-11-08
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • 总结android studio注意事项及打不开等问题解决方法

    经过一段时间的使用,总结了android studio打不开等问题的6种解决方法及android studio注意事项,希望对大家有所帮助。 1 首次运行,建立好项目需要下载一些东西,如果...2016-09-20
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • MySQL ERROR 2013 (HY000)错误解决方法

    当通过 TCP/IP 连接 MySQL 远程主机时,出现 ERROR 2013 (HY000): Lost connection to MySQL server at 'reading initial communication packet', system error: 104 。如果是在linux shell命令行中直接打 mysql 命令,...2015-03-15
  • IE6-IE9中tbody的innerHTML不能赋值的解决方法

    IE6-IE9中tbody的innerHTML不能赋值,重现代码如下 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"/> <title>IE6-IE9中tbody的innerHTML不能复制bug</title> </head> <body style="height:3...2014-06-07
  • PHP中SSO Cookie登录分析和实现

    什么是SSO?单点登录SSO(Single Sign-On)是身份管理中的一部分。SSO的一种较为通俗的定义是:SSO是指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护...2015-11-08
  • Mysql修改datadir导致无法启动问题解决方法

    centos6.2,停止mysqld然后修改/etc/my.cnf datadir的位置,启动mysqld提示FAILED,查看日志 复制代码 代码如下: 120609 11:31:31 mysqld_safe mysqld from pid file /var/run/mysqld/mysqld.pid ended 120609 11:35:12 my...2015-03-15
  • 小米解锁验证失败怎么办 小米解锁工具登录失败解决方法

    小米手机如果想要刷机就必须要先解锁验证才可以,那么,如果遇到小米解锁验证失败以及小米解锁工具登录失败的现象怎么办呢?对此,本文就为大家进行解答,有需要的朋友来看看。...2016-12-21
  • Photoshop提示“此产品的许可证已过期"及“无法开始您的Adobe Photoshop CS5.1 订阅”解决方法

    首先不要鄙视我用Photoshop盗版,实在是贵。现在我们来看看如果你的Photoshop提示“此产品的许可证已过期",还有“无法开始您的Adobe Photoshop CS5.1 订阅”如何解决吧...2016-09-14
  • vue项目中js-cookie的使用存储token操作

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

    今天小编在这里就来给各位photoshop的这一款软件的使用者们来详细的说一下软件的字体出现了乱码这一问题的解决方法,那么各位有出现这个问题的,下面就来跟着小编一起看...2016-09-14
  • 51安卓模拟器启动失败解决方法

    有部分小伙伴表示自己遇到了51模拟器程序不能打开的情况,那么51模拟器打不开怎么回事?下面我就来为大家分享一下解决的方法,有需要的小伙伴就来看一看吧。 &#8195;&...2017-07-06
  • 什么是cookie?js手动创建和存储cookie

    什么是cookie? cookie 是存储于访问者的计算机中的变量。每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie。你可以使用 JavaScript 来创建和取回 cookie 的值。 有关cookie的例子: 名字 cookie 当访...2014-05-31
  • CentOS下php使用127.0.0.1不能连接mysql的解决方法

    php代码很简单:复制代码 代码如下: $server="127.0.0.1"; println("Begin"); $link = mysql_connect($server,"mysql","mysql"); if (!$link) { die('Could not connect: ' . mysql_error().mysql_errno()); } lin...2015-03-15