PHP 三则(外一则)


作者:郑凯

渐渐的不敢写东西,因为偶尔 share 点什么会收到类似“你才知道啊?”这样的质疑。虽然明白,不管写什么东西,都会有人觉得有收获,有人觉得浪费时间,可依旧很纠结。

Suhosin

以前提到过 Suhosin。前些日子有个 hash 冲突的问题,还成了 PHP 5.3.9 的首要更新,但我不觉得生产环境下这会带来什么问题,因为稍微设置过的 Suhosin 都可以挡掉的。key 数量所造成的时间是指数增长,在 Supercolliding a PHP array 的例子里,把 pow(2, 16) 里的 16 换成 13、14 都不需要消耗太多时间,也就是说如果你设置了 suhosin.request.max_vars 哪怕到 1000(默认 200),也可以规避这个问题。

虽然 哈希冲突漏洞的原理和对策 的结尾提到

最稳妥的对策是,像 perl 一样,采用 Universal hashing 作为基本算法。

我依然认为 Suhosin 这种程度的设置就够了。理由是如果这个攻击没有显著的效果,那么就没有人会用了,但如果用额外的算法,是有额外开销的,伴随在每个 POST 里。这可以算做理科跟工科对待现实问题的差异。

更别说 Suhosin 还可以限定数组的层深了。

PHP.net 镜像

个人认为最好的 PHP 文档不是 .chm 的,也不是 pman,而是 PHP.net 的完整镜像。

官方早就 给出了方法,只需简单的跑个 rsync 的计划任务,就可以完整镜像,最主要的是,搜索跟官网没区别。简单起个域名设个 hosts 就可以给自己用了。

同时在 Chrome 里简单设置一下,就可以直接在浏览器地址栏直接搜索,Options > Basics > Search > Manage search engines ... 里如图设置:

以后直接在地址栏里敲 pman空格 接要搜的内容就可以(以前用 php 而不是 pman 做 keyword,但这样在用“php”作为 google 搜索词的第一个时会有歧义)

这东西的好处在于,你是“搜”,而不是“找”,不需要严格匹配,比方说你可以直接搜 array、upload 或者 html 都可以找到接近你想要的东西,但是用 pman 就不行了。

而 pman 的用处是,你可以在 Vim 里对一个函数直接用大写 K

Nginx / PHP-FPM 下的文件上传

简单的说,旧的模式是 Web Server 接收所有的内容,并转交给 PHP。所以想让 PHP 接收大附件,需要同时改动 php.ini 里的三个参数(在 Nginx 里还要多设一个 client_max_body_size

upload_max_filesize
post_max_size
memory_limit

也就是接收 POST 时、php 文件运行第一行代码之前,PHP 要一直运行,并占用内存。

而“新”(新是相对的,实际上两年前就有了)的方式是,Nginx 如果接收的 POST 超过指定大小,则将 POST 内容存成文件,发给 PHP-FPM 的时候,给的是 POST 的文件路径而非内容。详见 http://php-fpm.org/wiki/Features#Accelerated_upload_support

我对这种方式期盼已久,不但解放了 memory_limit(可惜 post_max_size 没有一并解决),同时在效率上,明白 md5_file($file)md5(file_get_contents($file)) 之间差异的都能明白这个

当刚有这种方式的时候,Nginx 和 FPM 都还不够“正式”,在二者都已经稳定的今天,这种方式似乎没得到应有的普及。要知道,这跟 PHP 代码没关系,只要版本够,在 nginx conf 里简单设置一下就可以享受这福利了。

// 取代 http://

在偶尔看扫了一眼 <wikipedia.org> 的源文件时,发现他没有 http:// 而全是 //

经过几天测试,发现 // 没有任何兼容性问题,不管是 <a href<img src<link href<script src 或者 CSS 里,甚至 <base target 里,都没有任何影响。跟完整的 http:// 无异

今天特意装了个 XP SP3,用 IE 6 试了一下,也能认。但我不清楚为何这么多年,这种写法没有得到普及。只能偶尔见到。

当然区别是有的,// 的语境取决于页面本身,如果你的页面是 https 的,那 // 就相当于 https://,我非但不觉得这是个问题,反而认为这能简化问题,比方说当你的页面可以同时兼容 http 和 https 访问的时候,不用在 HTML 模板上操太多心了。


Update in 2012.04.25

Druggo Yang 刚才提醒我,Google 已经在推荐这种写法了 http://google-styleguide.googlecode.com/svn/trunk/htmlcssguide.xml?showone=Protocol#Protocol