php5.6的file_put_contents问题求解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php5.6的file_put_contents问题求解相关的知识,希望对你有一定的参考价值。

<?php
$txt = intval(file_get_contents('cly.txt'));
file_put_contents('cly.txt', strval($txt + 1));
echo $txt;
?>
上面的是我php文件全部代码
-----------测试问题----------
php5.6环境下:
当运行这个文件的时候,如果cly.txt不存在,会生成一个cly.txt并写入数字1,页面404,也就是说echo $txt;并没有执行
服务器提示:PHP Warning: file_get_contents(cly.txt): failed to open stream: No such file or directory in D:\www\index.php on line 3
当运行这个文件的时候,如果cly.txt已经存在,会把cly.txt的数字+1并写回去,页面返回2,echo $txt;执行成功。

php5.2环境下:
当运行这个文件的时候,如果cly.txt不存在,会生成一个cly.txt并写入数字1,页面返回1,也就是说在5.2的环境下,即使cly.txt不存在,echo $txt;也依然执行了。

-----------那么问题来了----------
5.6的环境下,如果cly.txt不存在,那么用file_put_contents创建了该文件之后,页面就404了,怎么样才能让file_put_contents创建一个新文件之后依然正常的执行下去呢。同样的问题在5.2环境下就不存在,是我代码写的不规范吗?求指正,5.6中怎么才能正常。

你的代码确实不怎么规范;
有地方不明白你要干
<?php
$txt = intval(file_get_contents('cly.txt'));
file_put_contents('cly.txt', strval($txt + 1));
echo $txt;
?>
第一句话 intval是强制转换成整数。
file_get_contents返回类型是bool|string
结果就是 文件不存 返回的是false 而在一般的语言中都是false 本身就是0. 如果存在肯定返回的是里面的字符串。而任何的字符串只要不是数字开头 intval都会返回0。
而php 中 Warning 不会影响程序继续运行。
所以结果就是第一句话返回的文件不存在就是0,
至于你说的404描述错误 。这个不可能产生。
还有代码真的不严谨。
应该这样
$filename='cly.txt';
if(!file_exists($filename))//文件不存在的时候
file_put_contents($filename, '');//生成文件

$txt = intval(file_get_contents($filename)) ;
file_put_contents($filename, strval($txt + 1));
echo $txt;
这样就不会出现你说的问题了追问

这样子啊,是我钻牛角尖了,一直在想着怎么让先创建文件还不报错,忘记可以先判断了。谢谢老哥提醒,另外还有个问题,file_put_contents不能创建文件夹吗?目录已经设置可写,但是不能创建文件夹。
$filename='aaa/cly.txt';
file_put_contents($filename, '');//生成文件
这样子,aaa不能创建,必须手动创建aaa之后,cly.txt才能自动生成,有办法解决吗?

追答

用mkdir
第三个参数设置true;
mkdir('aaaa/bbb/ccc',777,true);可以创建多层
但是不能直接创建文件
mkdir('aaaa/bbb/ccc/cly.txt',777,true);这样会把cly.txt当成文件名

追问

谢老哥,已加分^_^

参考技术A 在PHP的一些应用中需要写日志或者记录一些信息,这样的话。可以使用fopen(),fwrite()以及 fclose()这些进行操作。也可以简单的使用file_get_contents()和file_put_contents().

file_put_contents()写文件。默认的是重新写文件,也就是会 替换原先的内容。追加的话使用参数FILE_APPEND.

以追加形式写入内容 当设置 flags 参数值为 FILE_APPEND 时,表示在已有文件内容后面追加内容的方式写入新数据:

FILE_APPEND:在文件末尾以追加的方式写入数据
int file_put_contents ( string filename, string data [, int flags [, resource context]] ) file_put_contents("log.txt", "Hello world everyone.", FILE_APPEND);
//参数说明:

filename //要写入数据的文件名

data //要写入的数据。类型可以是 string,array(但不能为多维数组),或者是 stream 资源

flags //可选,规定如何打开/写入文件。可能的值:

FILE_USE_INCLUDE_PATH://检查 filename 副本的内置路径

FILE_APPEND://在文件末尾以追加的方式写入数据

LOCK_EX://对文件上锁

context //可选,Context是一组选项,可以通过它修改文本属性

很多时候记录日志需要换行。不建议使用\r\n,因为:

在windows中\r\n是换行

在Mac中\r是换行

在Liunx中\n是换行

但是PHP提供了一个常量来匹配不同的操作系统,即:

PHP_EOL
file_put_contents("log.txt", "Hello world everyone.".PHP_EOL, FILE_APPEND);追问

滚犊子,你看题了吗,网上复制来的凑什么热闹,文不对题。

PHP中file_put_contents追加和换行

PHP的一些应用中需要写日志或者记录一些信息,这样的话。

可以使用fopen(),fwrite()以及 fclose()这些进行操作。

也可以简单的使用file_get_contents()file_put_contents().

file_put_contents()写文件。默认的是重新写文件,也就是会 替换原先的内容。追加的话使用参数FILE_APPEND

 

以追加形式写入内容 当设置 flags 参数值为 

FILE_APPEND 时,

表示在已有文件内容后面追加内容的方式写入新数据

 

//log
$tmpArr = array();
if($r->isGet){
    $tmpArr = $r->get();
}else if($r->isPost){
    $tmpArr = $r->post();
}
$jsonStr = json_encode($tmpArr);
$payLogFile = ‘./uploads/payLogs.txt‘;
$newLog =‘log_time:‘.date(‘Y-m-d H:i:s‘).$jsonStr;
file_put_contents($payLogFile, $newLog.PHP_EOL, FILE_APPEND);

 

 

很多时候记录日志需要换行。不建议使用\r\n,因为:
在windows中\r\n是换行
在Mac中\r是换行
在Liunx中\n是换行

但是php提供了一个常量来匹配不同的操作系统,即:

 

PHP_EOL
 
file_put_contents("log.txt""Hello world everyone.".PHP_EOL, FILE_APPEND);

file_put_contents($payLogFile, $newLog.PHP_EOL, FILE_APPEND);

 from:http://blog.csdn.net/u011335763/article/details/52860162






以上是关于php5.6的file_put_contents问题求解的主要内容,如果未能解决你的问题,请参考以下文章

php5.6 连接SQL SERVER

PHP5.5 和PHP5.6的区别

centos7更新php5.4到php5.6/php7

MacOS 安装PHP5.6

linux下升级php5.4到php5.6

Centos配置PHP5.6