Submitted by gouki on 2010, June 25, 8:37 PM
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代码
- <?php
- setcookie("bar", "www", time() + 10, "/", "www.foo.com");
- setcookie("bar", "foo", time() + 10, "/", ".foo.com");
- ?>
再编写浏览Cookie的脚本:
PHP代码
- <?php
- var_dump($_COOKIE);
- ?>
BTW:最初写脚本的时候我竟然在setcookie前使用了var_dump,也就是在发送请求头之前有了输出,犯了这样的初学者错误实在是罪过,可更令人惊讶的是脚本没有报错,查了半天原来是因为php.ini里缺省output_buffering = 4096。
先设置再浏览,就能看到结果了,结果显示有效的是子域下的Cookie。
重开一个浏览器窗口,并使用WebDeveloper删除Cookie,或手动删除,避免对结果造成影响。
然后调换两次调用setcookie的顺序,也就是先设置根域,再设置子域:
PHP代码
- <?php
- setcookie("bar", "foo", time() + 10, "/", ".foo.com");
- setcookie("bar", "www", time() + 10, "/", "www.foo.com");
- ?>
先设置再浏览,就能看到结果了,结果显示有效的是根域下的Cookie。
重复两次测试过程,并用Firebug记录下请求头的差异:
第一次先设置子域,再设置根域:请求头
Cookie的值是bar=www;bar=foo
,结果有效的是bar=www
第二次先设置根域,再设置子域:请求头
Cookie的值是bar=foo;bar=www,结果
有效的是
bar=foo
也就说,同名Cookie对于服务端PHP来说,在请求头Cookie中,哪个在前哪个生效,后面的会被忽略。
如果使用的不是Firefox,那就用不了Firebug,此时可以用PHP代码来检测Cookie头:
PHP代码
- 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, 老王, 子域, 根域
PHP | 评论:0
| 阅读:28661
Submitted by gouki on 2010, June 24, 10:34 AM
这样typecho的SVN源代码更新对我来说,有几个比较重要的地方。其中有一点就是我向70提出来的(我无法改源码)
1、需要能够对插件变量直接修改值,而不是通过config方法的form方式提交(其实我是想用在数据库备份插件中的,记录上次备份时间,以前的话,恐怕只能到option表里找到这个key,并且update这个key对应的value了),该方法目前存在于Helper类中。
2、修正附件的所有权(r1449)
多看看project页面的source中的change,可以看到更多修改记录。好象你有意见也可以去issues里面提(一个人更新。太慢了。。。)
Tags: typecho, svn, 插件
PHP | 评论:0
| 阅读:18714
Submitted by gouki on 2010, June 24, 9:59 AM
这张图很有意思,你是不是在其中感受到了什么 ?为什么我们做出来的东西客户总不满意?为什么总是要互相扯皮?原因呢?这张图表达了很多。
图片附件(缩略图):
Tags: 客户需求
PHP | 评论:0
| 阅读:15821
Submitted by gouki on 2010, June 23, 3:49 PM
这个PDF确实不错。只是。。。没有介绍netbeans下如何调试。phped下也没有介绍。仅介绍了zendstudio for eclipse和pdt还有vim的调试。不过。。。还是有很用处的东西。
对于浏览器的测试,除了PHP方面的print_r,var_dump等。他也介绍了firephp这个firefox的插件(基于firebug,如果不知道firebug那我也没啥好说的了)
对于最后简单的测试时间花费,也是用的传统的microtime来取的。额。。。他用的是PHP4的写法。只是最后介绍phpUnit就有点简单了。
XML/HTML代码
- 1 内置API输出调试
- 1.1 基本调试API
- 1.1.1 echo (print):
- 1.1.2 printf
- 1.1.3 print_r、var_dump(var_export)、debug_zval_dump
- 1.2 错误控制和日志记录调试
- 1.2.1 错误选项控制
- 1.2.2 错误抛出和处理
- 1.2.3 使用错误抑制符
- 1.2.4 日志记录
- 2 浏览器调试
- 2.1 页面输出调试
- 2.2 FirePHP 调试
- 2.2.1 普通变量监测
- 2.2.2 调用栈监测
- 2.2.3 监测抛出异常
- 2.2.4 组显示信息
- 3 IDE 调试
- 3.1 基本常用IDE介绍
- 3.1.1 Vim
- 3.1.2 Zend Studio
- 3.1.3 Eclipse
- 3.1.4 NetBeans
- 3.2 IDE调试
- 3.2.1 Zend Studio + Zend Debugger
- 3.2.2 Eclipse (PDT) + Xdebug
- 3.2.3 Vim + Xdebug + DBGp
- 4 PHP 性能调试技术
- 4.1 基本时间占用监测
- 4.2 使用 Xdebug 进行性能分析
- 4.2.1 安装配置:
- 4.3 APD(Advanced PHP Debugger)
- 4.3.1 安装配置
- 4.3.2 使用APD
- 4.4 使用Xhprof 进行性能分析
- 4.4.1 Xhprof 的优点:
- 5 PHP单元测试技术
- 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 | 评论:1
| 阅读:20573
Submitted by gouki on 2010, June 20, 8:12 PM
这是一篇比较老的文章,其实从情感上来说,我更愿意推荐手册上的介绍,但事实上,在一些PHP群中,有些朋友在问的时候,他们总是想不到翻手册的。嗯,英文的手册确实让人不太舒服,但,不可能在手册一出来就帮你翻译好的吧?事事都去期待别人,还不如把英文好好看看,再者,手册上的英文真的很简单的。
我不知道你们的手册是怎么样的,版本多少,但是我在我的手册里是有这么一个章节:
Chapter 38. Handling file uploads
- POST method uploads
- Error Messages Explained
- Common Pitfalls
- Uploading multiple files
- 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).
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: 上传
PHP | 评论:0
| 阅读:24373