标签存档: PHP

关于PHP对文件元信息的缓存

今天在测试 SAE (Sina App Engine) 的Memcache Wrapper 时发现,PHP会在同一个页面的执行过程中对文件的元信息进行缓存。

根据PHP文档对 clearstatcache() 这个方法的说明得知:
在使用 stat(), lstat(), file_exists(), is_writable(), is_readable(), is_executable(), is_file(), is_dir(), is_link(), filectime(), fileatime(), filemtime(), fileinode(), filegroup(), fileowner(), filesize(), filetype(), 或 fileperms() 方法查询文件信息时,PHP会将文件的stat的缓存以提高性能。 clearstatcache()方法可以用来清除这个缓存。另外unlink()会自动清除stat缓存。

例如以下一段程序:

1
2
3
4
5
6
file_put_contents("test.txt", "test_content\n");
var_dump(filesize("test.txt"));
file_put_contents("test.txt", "test_content\n", FILE_APPEND);
var_dump(filesize("test.txt"));
clearstatcache();
var_dump(filesize("test.txt"));

最后会输出

int(13)
int(13)
int(26)

但是通过阅读PHP源码,我发现只有在对本地文件进行unlink, rename和rmdir操作时会清除stat缓存,而在通过其他的wrapper进行unlink, rename和rmdir操作时,并不会清除stat缓存。因此在写wrapper时我们要自己在unlink等方法中通过clearstatcache()来清除stat。

PHP中流程控制的替代语法

PHP 提供了一些流程控制的替代语法,包括 if,while,for,foreach 和 switch。替代语法的基本形式是把左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch;。

使用这种语法时需要注意:elseif不可以分开写为else if,否则会编译不通过
继续阅读 »

mt_rand与rand

貌似好久没写日志了

今天在手册中查rand()用法时,无意发现了mt_rand()这个函数。

很多老的 libc 的随机数发生器具有一些不确定和未知的特性而且很慢。PHP 的 rand() 函数默认使用 libc 随机数发生器。mt_rand() 函数是非正式用来替换它的。该函数用了 » Mersenne Twister 中已知的特性作为随机数发生器,它可以产生随机数值的平均速度比 libc 提供的 rand() 快四倍。

手册真的是个好东西呀,时常查查手册,也能发现不少小技巧,呵呵。

[转]PHP 中巧用数组降低程序的时间复杂度

原文地址:PHP 中巧用数组降低程序的时间复杂度.

级别: 初级

王 丹丹, 高级软件工程师, IBM

2009 年 11 月 26 日

本文主要是介绍在 PHP 的编程中,如何巧用数组来降低因多层循环而引起的时间复杂度的问题。特别是当程序需要多次与数据库交互时,用此方法来优化你的代码,将会带给意想不到的效果。

继续阅读 »

PHP语法测试

PHP是个弱类型语言,于是很多PHP程序员就对PHP的变量类型很不在乎了。但是弱类型不是无类型,有时候确定一个变量的类型还是很重要的。下面这套测试题可以帮你测试一下自己对PHP的语法基础到底掌握得牢不牢,建议PHP程序员们都做一下。

http://www.blueshoes.org/en/developer/syntax_exam/

json_encode不支持中文的一个解决方法

今天头一回用json_encode,发现它不支持中文,数组中所有中文在json_encode之后都不见了,Google了一下,感觉那些解决方法都不太方便,自己研究了一下,想出一个相对比较简单的方法:

在json_encode之前,把所有数组内所有内容都用urlencode()处理一下,然用json_encode()转换成json字符串,最后再用urldecode()将编码过的中文转回来。

写了个函数JSON来代替json_encode,这种方法在我的程序中测试是成功的: 继续阅读 »

[转]高级PHP应用程序漏洞审核技术

原文地址:http://www.ph4nt0m.org-a.googlepages.com/PSTZine_0x03_0x06.txt
作者:==Ph4nt0m Security Team==

原文下载:PSTZine_0x03_0x06.txt

                           ==Ph4nt0m Security Team==

                       Issue 0x03, Phile #0x06 of 0x07

|=---------------------------------------------------------------------------=|
|=---------------------=[ 高级PHP应用程序漏洞审核技术 ]=---------------------=|
|=---------------------------------------------------------------------------=|
|=---------------------------------------------------------------------------=|
|=----------------------=[    By www.80vul.com     ]=------------------------=|
|=------------------------=[   <www.80vul.com>   ]=--------------------------=|
|=---------------------------------------------------------------------------=|
 继续阅读 »

PHP输出缓存

一般情况下,PHP都是将整个页面全部执行完成后,才会把要输出的内容发送回客户端。例如有如下代码:

1
2
3
4
for ($i = 0; $i &lt; 10; $i++) {
	echo $i;
	sleep(1);
}

这段代码会在10秒钟后一次性输出“0123456789”。 继续阅读 »

PHP自动识别字符集并完成转码

在PHP处理页面的时候,我们对于字符集的转换都是采用了iconv或者mb_convert等函数,但,这其实是有一个前提的。即我们事先得知道in和out是什么样的编码,我们才能进行正确的转换。
下面这个函数,就可以在不知道源字符串编码的情况下,自动判断其编码并进行转换。虽然只支持UTF8编码和GB2312编码,但对于国内绝大多数网站来说,已经够用了。 继续阅读 »

PHP实现的文件直接输出下载[转载]

你一定会笑我“下载文件”如此简单都值得说?当然并不是想你想象的那么简单。 例如你希望客户要填完一份表格,才可以下载某一文件,你第一个想法一定是用 “Redirect”的方法,先检查表格是否已经填写完毕和完整,然后就将网址指到该文件,这样客户才能下载,例如笔者编写的以下代码: 继续阅读 »