php write_file,PHP中fwrite与file_put_contents的区别

PHP中fwrite与file_put_contents在细节上在区别但在性能上file_put_contents更强大了,我们下面举例来对比一下吧。

相同点:file_put_contents() 函数把一个字符串写入文件中,与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

不同点:在file_put_contents()函数中使用 FILE_APPEND 可避免删除文件中已有的内容,即实现多次写入同一个文件时的追加功能。

例如:

echo file_put_contents("test.txt","Hello World. Testing!",FILE_APPEND);

file_put_contents是以追加的形式将字符串写入到test.txt中,

fwrtie则是会清除之前的记录,只保留当前写入的内容

$file = fopen("test.txt","w");

echo fwrite($file,"Hello World. Testing!");

fclose($file);

file_put_contents代替fwrite优点多多

如下为file_put_contents的实例代码:

$filename = 'file.txt';

$word = "你好!\r\nwebkaka";  //双引号会换行 单引号不换行

file_put_contents($filename, $word);

?>

同样的功能使用fwrite的实例代码:

$filename = 'file.txt';

$word = "你好!\r\nwebkaka";  //双引号会换行  单引号不换行

$fh = fopen($filename, "w"); //w从开头写入 a追加写入

echo fwrite($fh, $word);

fclose($fh);

?>

从以上两个例子看出,其实file_put_contents是fopen、fwrite、fclose三合一的简化写法,这对程序代码的优化是有好处的,一方面在代码量上有所减少,另一方面不会出现fclose漏写的不严密代码,在调试、维护上方便很多。

上述例子里,file_put_contents是从头写入,如果要追加写入,怎么办呢?

在file_put_contents的语法里,有个参数FILE_APPEND,这是追加写入的声明。实例代码如下:

echo file_put_contents('file.txt', "This is another something.", FILE_APPEND);

?>

FILE_APPEND就是追加写入的声明。在追加写入时,为了避免其他人同时操作,往往需要锁定文件,这时需要加多一个LOCK_EX的声明,写法如下:

echo file_put_contents('file.txt', "This is another something.", FILE_APPEND|LOCK_EX);

?>

注意,以上代码中echo输出到显示器里的是写入文件字符串的长度。

常见问题:

Warning: fopen(file.txt) [function.fopen]: failed to open stream: Permission denied

当写入文件时,有时会遇到上述问题,这是因为文件没有写权限的原因。为了避免这个错误的出现,在写入文件时需要判断下文件是否可写,这需要用到is_writable()这个函数。实例代码如下:

$filename = 'file.txt';

if (is_writable($filename)) {

echo file_put_contents($filename, "This is another something.", FILE_APPEND);

} else {

echo "文件 $filename 不可写";

}

?>

fwrite简单的把数据写到handler里面

file_put_contents可能需要处理contenxt,数据类型为mixed,需要更多处理

虽然看file_put_contents的函数说明:和依次调用 fopen(),fwrite() 以及 fclose() 功能一样。

但是肯定有细微差别的,尤其是在重复写入大量数据的时候,file_put_contents无疑会重复的fopen,fclose .而 fwrite则可以只一次fopen,fwrite即可

写个简单程序测试一下,一个250M文件

结论:多次执行结果类试,说明fopen,fwrite,fclose方式比直接file_put_contents要快一点!

那么为什么呢? 查看源代码

我用的ubuntu12.04

直接sudo apt-get source php5

解压:silver@silver-desktop:~/php/php5-5.3.3

查找函数fwrite 函数:silver@silver-desktop:~/php/php5-5.3.3$ grep -rn “PHP_FUNCTION(fwrite)” .

./ext/standard/file.c:1233:PHPAPI PHP_FUNCTION(fwrite)

./ext/standard/file.h:43:PHPAPI PHP_FUNCTION(fwrite);

fwrite

找到对应源码,该函数非常简单:

file_put_contents

该函数的处理操作就多多了

什么时候用fwrite,file_put_contents ?

1,函数原型已经说明了它们处理的数据类型不一样

2,简单的文件处理,追求速度用fwrite

3,书写简单用file_put_contents – (啥类型的数据都能处理,magic阿。但是要理解类型判断机制,否则保存的数据可能不是你想要的)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值