手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

子域和根域同名cookie的处理

PHP处理COOKIE是一件很方便的事情。print_r($_COOKIE)就可以打印所有的cookie变量。而且cookie也能够存为数组。确实操作和应用都非常方便 。

以前,对于子域和根域下的cookie并没有研究太深。因为都直接设在根域的。以前注意cookie是路径(path),这个的影响也是有的。不过现在大多数程序的cookie都是设在根路径(“/”)下,所以也回避了不少问题。

以下是老王提出的问题和解决方法(子域和根域同名cookie的处理),引伸开的话,你也可以测试一下,根路径与子路径下同名cookie的情况。【果然,老王文章结尾就是这样的提问,呵呵】

我们都知道,在子域下请求时,浏览器会把子域和根域下的Cookie一起发送到服务器,那如果子域和根域下有一个同名Cookie,当我们在PHP里使 用$_COOKIE访问时,到底生效的是哪个呢?下面做试验测试一下,测试使用Firefox,用到了以下插件:SwitchHosts+WebDeveloper+Firebug

注意:试验结果可能因为浏览器的不同而存在差异。

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

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

PHP代码
  1. <?php  
  2. setcookie("bar""www", time() + 10, "/""www.foo.com");  
  3. setcookie("bar""foo", time() + 10, "/"".foo.com");  
  4. ?>  
再编写浏览Cookie的脚本:
PHP代码
  1. <?php  
  2. var_dump($_COOKIE);  
  3. ?>  
BTW:最初写脚本的时候我竟然在setcookie前使用了var_dump,也就是在发送请求头之前有了输出,犯了这样的初学者错误实在是罪过,可更令人惊讶的是脚本没有报错,查了半天原来是因为php.ini里缺省output_buffering = 4096。

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

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

然后调换两次调用setcookie的顺序,也就是先设置根域,再设置子域:
PHP代码
  1. <?php  
  2. setcookie("bar""foo", time() + 10, "/"".foo.com");  
  3. setcookie("bar""www", time() + 10, "/""www.foo.com");  
  4. ?>  
先设置再浏览,就能看到结果了,结果显示有效的是根域下的Cookie。

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

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

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

如果使用的不是Firefox,那就用不了Firebug,此时可以用PHP代码来检测Cookie头:
PHP代码
  1. if (isset($_SERVER['HTTP_COOKIE'])) var_dump($_SERVER['HTTP_COOKIE']);  

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

题外话:类似的情况,如子目录和根
目录下的同名Cookie是什么情况,读者可以自行测试。

--EOF--

原文来自:http://hi.baidu.com/thinkinginlamp/blog/item/899551dacd807ad6b6fd48cd.html

 

Tags: cookie, 老王, 子域, 根域

typecho SVN更新

这样typecho的SVN源代码更新对我来说,有几个比较重要的地方。其中有一点就是我向70提出来的(我无法改源码)
1、需要能够对插件变量直接修改值,而不是通过config方法的form方式提交(其实我是想用在数据库备份插件中的,记录上次备份时间,以前的话,恐怕只能到option表里找到这个key,并且update这个key对应的value了),该方法目前存在于Helper类中。
2、修正附件的所有权(r1449)

多看看project页面的source中的change,可以看到更多修改记录。好象你有意见也可以去issues里面提(一个人更新。太慢了。。。)

Tags: typecho, svn, 插件

网上一张有意思的图

这张图很有意思,你是不是在其中感受到了什么 ?为什么我们做出来的东西客户总不满意?为什么总是要互相扯皮?原因呢?这张图表达了很多。

图片附件(缩略图):
大小: 215.85 K
尺寸: 160 x 376
浏览: 1796 次
点击打开新窗口浏览全图

Tags: 客户需求

PHP调试技术手册发布

这个PDF确实不错。只是。。。没有介绍netbeans下如何调试。phped下也没有介绍。仅介绍了zendstudio for eclipse和pdt还有vim的调试。不过。。。还是有很用处的东西。

对于浏览器的测试,除了PHP方面的print_r,var_dump等。他也介绍了firephp这个firefox的插件(基于firebug,如果不知道firebug那我也没啥好说的了)

对于最后简单的测试时间花费,也是用的传统的microtime来取的。额。。。他用的是PHP4的写法。只是最后介绍phpUnit就有点简单了。

XML/HTML代码
  1. 1 内置API输出调试  
  2. 1.1 基本调试API  
  3. 1.1.1 echo (print):  
  4. 1.1.2 printf  
  5. 1.1.3 print_r、var_dump(var_export)、debug_zval_dump  
  6. 1.2 错误控制和日志记录调试  
  7. 1.2.1 错误选项控制  
  8. 1.2.2 错误抛出和处理  
  9. 1.2.3 使用错误抑制符  
  10. 1.2.4 日志记录  
  11. 2 浏览器调试  
  12. 2.1 页面输出调试  
  13. 2.2 FirePHP 调试  
  14. 2.2.1 普通变量监测  
  15. 2.2.2 调用栈监测  
  16. 2.2.3 监测抛出异常  
  17. 2.2.4 组显示信息  
  18. 3 IDE 调试  
  19. 3.1 基本常用IDE介绍  
  20. 3.1.1 Vim  
  21. 3.1.2 Zend Studio  
  22. 3.1.3 Eclipse  
  23. 3.1.4 NetBeans  
  24. 3.2 IDE调试  
  25. 3.2.1 Zend Studio + Zend Debugger  
  26. 3.2.2 Eclipse (PDT) + Xdebug  
  27. 3.2.3 Vim + Xdebug + DBGp  
  28. 4 PHP 性能调试技术  
  29. 4.1 基本时间占用监测  
  30. 4.2 使用 Xdebug 进行性能分析  
  31. 4.2.1 安装配置:  
  32. 4.3 APD(Advanced PHP Debugger)  
  33. 4.3.1 安装配置  
  34. 4.3.2 使用APD  
  35. 4.4 使用Xhprof 进行性能分析  
  36. 4.4.1 Xhprof 的优点:  
  37. 5 PHP单元测试技术  
  38. 5.1 PHPUnit  
下载地址: http://heiyeluren-doc.googlecode.com/files/PHP-Debug-Manual-public.pdf

本地备份:php-debug-manual-public.pdf

来源网址:http://www.laruence.com/2010/06/21/1608.html

 

 

Tags: 风雪之隅, 调试

PHP文件上传全攻略

这是一篇比较老的文章,其实从情感上来说,我更愿意推荐手册上的介绍,但事实上,在一些PHP群中,有些朋友在问的时候,他们总是想不到翻手册的。嗯,英文的手册确实让人不太舒服,但,不可能在手册一出来就帮你翻译好的吧?事事都去期待别人,还不如把英文好好看看,再者,手册上的英文真的很简单的。
我不知道你们的手册是怎么样的,版本多少,但是我在我的手册里是有这么一个章节:

Chapter 38. Handling file uploads
  1. POST method uploads  
  2. Error Messages Explained  
  3. Common Pitfalls  
  4. Uploading multiple files  
  5. PUT method support  

一共讲了5种情况,而且对于不能上传大文件也专门做了介绍,他是这么说的:

PHP is capable of receiving file uploads from any RFC-1867 compliant browser (which includes Netscape Navigator 3 or later, Microsoft Internet Explorer 3 with a patch from Microsoft, or later without a patch).

Related Configurations Note: See also the file_uploads, upload_max_filesize, upload_tmp_dir, post_max_size and max_input_time directives in php.ini

PHP also supports PUT-method file uploads as used by Netscape Composer and W3C's Amaya clients. See the PUT Method Support for more details.

OK,我知道你们不愿意看,所以我也不多说了,看中文版吧,原文来自于:http://www.sourcejoy.com/php_dev/PHP_upload.html。
PHP文件上传功能一般都是大家使用事先封装好的函数,要用的时候直接使用已封装的函数就完了,但有时候不能使用封装函数,还真不大能记住PHP的上传相关的东西,在此做个总结,以备后用。

1.表单部分
允许用户上传文件,在HTML表单的声明中要加上一个上传的属性:
enctype = 'multipart/form-data'
表单的method必须是POST
表单选项MAX_FILE_SIZE隐藏域用于限制上传文件大小,它必须放在文件表单元素前面,单位为字节。
如:
<form enctype='multipart/form-data' id='aa' name='aaa' method='post' action='xxx.php'>
<input type='hidden' name='MAX_FILE_SIZE' value='2621114' />
<input name='upload_file' type='file' />
</form>

2.处理上传文件
上传时,PHP收到关于该文件的信息数组,这些信息可以在$_FILES这个超级全局数组中找到。
如:如果表单中的文件输入框名字为upload_file,那么关于该文件的所有信息都包含在数组$_FILES['upload_file']里面。
如:客户上传了一个“aaa.jpg”的图片数组值如下:
name "p5pp.jpg" 上传时文件的名字
type “image/jpeg" 文件类型
tmp_name "/tmp/phpjksdf" 服务器端的临时文件名
error 上传错误的返回值
size 2045 文件实际大小

上面数组里面的error会返回不同的常量值,如下:
UPLOAD_ERR_OK 没有错误发生,文件上传成功
UPLOAD_ERR_INI_SIZE 文件大小超过了PHP.INI中upload_max_filesize选项限制的值
UPLOAD_ERR_FORM_SIZE 上传文件的大小超过了HTML表单中MAX_FILE_SIZE选项值。可在程序中检查表单$FILES ['up_file']['size']来处理
UPLOAD_ERR_PARTIAL 文件只有部分被上传
UPLOAD_ERR_NO_FILE 用户没有提供任何文件上传
上传后处理的具体例子:
if(!move_uploaded_file($_FILES['f']['tmp_name'],"uploads/".$_FILES['f']['name'].".jpg")){
echo "error";
}

函数:
move_uploaded_file 移动上传的临时文件到指定的目录下
例子:
move_uploaded_file('临时文件名','指定文件路径')

is_uploaded_file 判断是否是通过http Post上传的文件
例子:
if(!is_uploaded_file($_FILES['f']['tmp_name'])){
echo '非法';
}

3.相关参数
PHP上传设计到的php.ini中的参数:
file_uploads 是否允许上传文件,默认ON

upload_tmp_dir 上传文件防止的临时目录,未指定则使用系统默认位置

upload_max_filesize 允许上传文件的大小的最大值,默认为2M

post_max_size 控制采用POST方法进行一次表单提交中PHP所能接受的最大数据量,如果希望用PHP文件上传,则此值要改为比upload_max_filesize要大

max_input_time 以秒为单位对通过POST/GET/PUT方式接受数据时间进行限制。

memory_limit 为了避免正在运行的脚本大量使用系统内存,PHP允许定义内存使用限额。通过设置此参数来制定单个脚本程序可以使用的最大内存容量,应适当大于post_max_size值

max_execution_time 用来设置在强制终止脚本前PHP等待脚本执行完毕的时间,单位秒。次选项可限制死循环脚本,但当存在一个长时间的合法活动时(如:上传大文件),这项功能也会导致操作失败。这样情况下必须考虑将此变量增加。

4.考虑多文件上传
可以利用$_FILES数组就可以轻松实现多文件上传。$_FILES数组可以获取客户端表单里面所有的file域内容,从而获得所有在同一表单上传的文件。

5.突破上传的内存限制
方法一:
修改php.ini中memory_limit值,改为更大,如 64M
方法二:
使用Apache Rewrite方法,动态修改memory_limit的值。首先建立一个.htaccess文件,保存在上传文件程序的 当前目录即可.代码如下:
php_value memory_limit 100M
php_value post_max_size 30M
php_value upload_max_filesize 30M
php_value max_execution_time 300
php_value max_input_tim 300
php_value display_errors On

——EOF——
当然,如果你在这种下也还是看不懂不能理解的话,我也就没有话说喽。

Tags: 上传