PHP开发基础教程之PHP对文件的操作
一、文件系统
1.我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。
2.在电脑里面进行的这些操作,在代码里面如果能操作就好了。
3.因为,如果有了这些操作。我们能做很多事情了:
可不可以写入修改配置文件?
是不是可以做PHP安装的时候检测文件的权限
是不是可以做生成Html文件等等很多不同的操作
..... 其他太多太多的地方用到了文件操作。
4.学习文件处理本质上面就是学习文件处理的函数。再结合之前写的代码,完善自己的业务处理能力。
二、读取文件
1.readfile读取文件
那如何读取一个文件呢?我们先学一个函数。
int readfile ( string $文件名)
功能:传入一个文件路径,输出一个文件。
下面的这一段代码中,只要传入文件名或者指定的文件路径就把文件读取出来了。
<?php //linux类的读了方式 readfile("/home/paul/test.txt"); //windows类的读取方式 readfile("c:\\boot.ini"); ?>
注意:上面的代码中windows的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。
2.file_get_contents打开文件
上面的是单纯打文件就直接输出了,有没有打开文件后,能够赋值给一个变量的操作方式呢。
PHP当然会提供这种方式。这个方式就是PHP打开文件并返回内容的方式之一,我们来看看函数:
string file_get_contents ( string filename)
功能:传入一个文件或文件路径,打开这个文件返回文件的内容。文件的内容是一个字符串。
<?php $filename = 'NoAlike.txt'; $filestring = file_get_contents($filename); echo $filestring; ?>
上面的代码,就打开了一个文件,并且将文件当中的内容进行了输出。
我们来针对之前的知识把代码进行一下扩展。用一用之前的知识点。
<?php //假设我们有一个多行的文件叫NoAlike.txt,没有的话你可以新建一个这个文件 $filename = 'NoAlike.txt'; //打开这个文件,将文件内容赋值给$filestring $filestring = file_get_contents($filename); //因为每一行有一个回车即\n,我用\n来把这个字符串切割成数组 $filearray = explode("\n", $filestring); //把切割成的数组,下标赋值给$key,值赋值给$val,每次循环将$key加1。 while (list($key, $val) = each($filearray)) { ++$key; $val = trim($val); //用的单引号,单引号不解释变量进行了拼接而已 print 'Line' . $key .':'. $val.'<br />'; } ?>
上面,我们就把之前所学的知识进行了组合。
3.fopen、fread、fclose操作读取文件
上面file_get_contents打开文件的方式简单、粗暴。下面的
resource fopen ( string $文件名, string 模式)
string fread ( resource $操作资源, int 读取长度)
bool fclose ( resource $操作资源 )
通过上面的函数我们来讲解资源类型的通常操作方式:
打开资源
使用相关函数进行操作
关闭资源
fopen函数 fopen函数的功能是打开文件,参数主要有两个:
l 文件打开的路径
l 打开文件的模式
返回类型是一个资源类型,我们第一次遇到了之前基础类型的时候讲到的资源类型。
资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。
fread函数 函数的功能的功能是读取打开的文件资源。读取指定长度的文件资源,读取一部份向后移动一部份。至到文件结尾。
fclose函数 fclose函数的功能是关闭资源。资源有打开就有关闭。
了解完函数,后两个函数比较简单。而fopen函数的模式到底是什么,fopen的模式有下面几个,我们来讲一下fopen的模式:
接下来,我们只来学习r模式,下节课我们在将写入的时候再来讲讲其他几个模式。
三、我们先会读取文件了,才能很好的掌握写入文件。
1.打开文件
<?php //你可以创建一个NoAlike.txt,以只读模式打开 $fp = fopen('NoAlike.txt', "r"); //var_dump()操作一下$fp看看效果,输出的是不是只有类型提示的是resource var_dump($fp); ?>
2.读取文件
<?php $fp = fopen('NoAlike.txt', "r"); //打开一个文件类型后,读取长度 $contents = fread($fp, 1024); ?>
3.关闭文件
<?php $fp = fopen($filename, 'r'); $contents = fread($fp, 1024); fclose($fp); echo $contents; ?>
其他注意事项:
使用示例:
<?php $fp = fopen($filename, 'ab'); $contents = fwrite($fp, '可爱的很\n哟'); fclose($fp); echo $contents; ?>
说明:
实验无法让肉眼看到这个实验效果。大家记住有这个特点即可。
Windows 下提供了一个文本转换标记('t')可以透明地将 \n 转换为 \r\n。
与此对应还可以使用 'b' 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。
四、创建和修改文件内容
1.file_put_contents写入文件
我们先来学习第一种写入文件的方式:
int file_put_contents ( string $文件路径, string $写入数据])
功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度
<?php $data = "我是一个兵,来自老百姓"; $numbytes = file_put_contents('binggege.txt', $data); if($numbytes){ echo '写入成功,我们读取看看结果试试:'; echo file_get_contents('binggege.txt'); }else{ echo '写入失败或者没有权限,注意检查'; } ?>
我们发现写入文件也挺简单的。按照这个函数的格式,指定文件,写入字符串数据就可以了。
2.fwrite配合fopen进行写入操作
int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])
注:fwrite的别名函数是fputs
我们上节课试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入。
我们来看一下特点:
写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。
注意:在下面的实验中,你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。
<?php $filename = 'test.txt'; $fp= fopen($filename, "w"); $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘'); fclose($fp); print $len .'字节被写入了\n"; ?>
总结:
1.不论有没有新建都会打开文件重新写入
2.原有的文件内容会被覆盖掉
3.文件不存在会创建
那我们来对比一下以下几个模式的不同:
我们来通过实验证明一下:
<?php $filename = 'test.txt'; $fp= fopen($filename, "r+"); $len = fwrite($fp, '我是一只来自南方的狼,一直在寻找心中的花姑娘'); fclose($fp); print $len .'字节被写入了\n'; ?>
实验时可以把r后面的+号去掉。
我们通过实验,确实发现使用r模式,在文件存的时候可以进行写入数据,只用r的话,写入是不成功的。
3.a模式和w模式的不同
同样是下面的这段代码,我们改为a模式。
<?php $filename = 'test.txt'; $fp= fopen($filename, "a"); $len = fwrite($fp,'读大学迷茫了,PHP学院PHP给你希望'); echo $len .'字节被写入了\n'; ?>
打开网页执行这段代码,你会发现:每刷新一次,文件中就会多一段
读大学迷茫了,PHP学院PHP给你希望。
总结:
4.x模式和w模式的不同
这段代码我们再实验一次,改为x模式:
<?php $filename = 'test.txt'; $fp= fopen($filename, "x"); $len = fwrite($fp,'读大学迷茫了,PHP学院PHP给你希望'); echo $len .'字节被写入了\n'; ?>
我们会发现:
文件存在的时候会报错
如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了
x+ 是增强的x模式。读取时也可以使用。
五、创建临时文件
我们之前创建的文件都是永久文件。
而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:
1.文完后即删除
2.不需要去维护这个文件的删除状态
例如:我需要把A的文件内容转存B里面,把B的文件内容转存到C里面。
就跟现实生活中一样,我可以先用一个临时的瓶子把B的水装起来,然后把A的数据写入到B里面。把临时瓶子的水追加到C里面。
我们来学习一下这个函数:
resource tmpfile ( )
功能:创建一个临时文件,返回资源类型。关闭文件即被删除。
<?php //创建了一个临时文件 $handle = tmpfile(); //向里面写入了数据 $numbytes = fwrite($handle, '写入临时文件'); //关闭临时文件,文件即被删除 fclose($handle); echo '向临时文件中写入了'.$numbytes . '个字节'; ?>
六、移动、拷贝和删除文件
1.重命名
bool rename($旧名,$新名);
这个函数返回一个bool值,将旧的名字改为新的名字。
<?php //旧文件名 $filename = 'test.txt'; //新文件名 $filename2 = $filename . '.old'; //复制文件 rename($filename, $filename2); ?>
我们打开目录,我们可以看看效果,你会发现把指定的文件,复制了一份到了目标路径。
2.复制文件
复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。
bool copy(源文件,目标文件)
功能:将指定路径的源文件,复制一份到目标文件的位置。
我们来通过实验和代码来玩玩:
<?php //旧文件名 $filename = 'copy.txt'; //新文件名 $filename2 = $filename . '_new'; //修改名字。 copy($filename, $filename2); ?>
总结:
你会通过上面的例子,发现多出来了一个文件。
3.删除文件
删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。
你只会发现,这个文件消失了。
bool unlink(指定路径的文件)
<?php $filename = 'test.txt'; if (unlink($filename)) { echo "删除文件成功 $filename!\n"; } else { echo "删除 $filename 失败!\n"; } ?>
七、检测文件属性函数
有些同学特别好奇,检测文件属性用在什么地方。检测文件属性能用到的地方太多了。
我们来举例子:
1.我们在做软件安装的时候,大家会发现如果文件存在了,就跳转到了其他的地方。
2.如果在安装的过程当中,某些文件没有写入权限,就不让进行安装。
我们来举一个国内非常出名的软件,discuz的安装过程截图给大家看看:
上面的例子,就是典型的文件检测的用法。
我们来学习一下下面的一批函数。然后,我们来通过一个例子进行学习。
bool file_exists ( $指定文件名或者文件路径)
功能:文件是否存在。
bool is_readable ( $指定文件名或者文件路径)
功能:文件是否可读
bool is_writeable ( $指定文件名或者文件路径)
功能:文件是否可写
bool is_executable ( $指定文件名或者文件路径)
功能:文件是否可执行
bool is_file ( $指定文件名或者文件路径)
功能:是否是文件
bool is_dir ( $指定文件名或者文件路径)
功能:是否是目录
void clearstatcache ( void )
功能:清楚文件的状态缓存
上面的功能一看就清楚了。那实验,我们就来写这个最开始我们举的这个例子。
我们来讲第一个例子,文件锁。如果已经安装了,存在安装锁就提示已安装,否则就继续安装。
我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。
<?php if(file_exists('install.lock')){ echo '已安装,请不要再次进行安装'; exit; } ?>
我们接下来做一个文件安装检测的实验来检测文件或目录是否有写入或者读取权限。如果没有则不能进行安装。
处理这件事情的思路如下:
1.定义一批需要检测权限的数组
2.可以检测是文件夹还是文件
3.做一个标置位变量,如果标置位变量一旦为false则不显示下一步的安装
<?php //可以定义一批文件是否存在 $files = [ 'config.php', 'img/', 'uploads/', ]; //定义标志位变量 $flag = true; foreach($files as $v){ echo $v; //判断是文件还是文件夹 if(is_file($v)){ echo '是一个文件 '; }else if(is_dir($v)){ echo '是一个文件夹 '; } if(is_readable($v)){ echo ' 可读'; }else{ echo '<font color="red">不可读</font>'; } if(is_writeable($v)){ echo '可写'; }else{ echo '<font color="red">不可写</font>'; } echo '<br />'; } if($flag){ echo '<a href="step1">下一步</a>'; }else{ echo '不能进行安装'; } ?>
通过上面的例子,我们就做到了。实现PHP某个软件安装过程当中的安装检测。
也就是我们上面思路的实现。
八、文件常用函数和常量
1.文件操作的常量
下面这一个常量是最常用的。是文件目录的分割符的常量。
我们来看看格式:
windows 的路径格式为 d:\xxx\xxx 注意:windows支持 d:/xxx/xxx
linux 的路径格式为 /home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是错误的
所以当你开启转义之类的话,转义字符 \ 用一起的话 d:\xxx\xxx 是一样的。判断时候有两个 \ 有的话 再转成一个\ 再把 \ 替换成 /当路径分割,这样在linux上或者windos上的路径就能保持统一了。
我们会使用到一个常量:
DIRECTORY_SEPARATOR
我们来写一个小的实例,定义当前文件所在的路径:
由于FILE是PHP的预定义常量,所以没办法改变,如果需要让FILE也自适应操作系统。
那么就是不要用FILE,可以用自定义的常量,并且把FILE处理一下,如下:
<?php $_current_file = str_replace(array('/', '\\'), DIRECTORY_SEPARATOR, __FILE__); define('__CUR_FILE__', $_current_file); echo __CUR_FILE__; ?>
2.文件指针操作函数
rewind ( resource handle)
功能:指针回到开始处
fseek ( resource handle, int offset [, int from_where])
功能:文件指针向后移动指定字符
我们在之前的读取当中我们发现fread读取指定长度的数据。读取指定长度的内容,下次再读取的时候从原位置开始再接着向后读取。
如上图,我们可以想象:
1.文件刚打开的时候读取到的是红色的图标
2.文件假色从A读取到了C
3.我们在demo.txt文件中写入一批文件:
Abcdeefghijklk
Opqrst
Uvwxyz
12345678
我们可开始来实验一次。
<?php $fp = fopen('output.txt', 'r+'); //读取10个字符 echo fread($fp,10); //指针设置回到开始处 rewind($handle); //再读取10次看看输出的是什么 echo fread($fp,10); //文件指针向后移动10个字符 echo fseek($fp,10); //再看看文件中输出的是什么 echo fread($fp,10); fclose($handle); ?>
上面的例子,你会发现fseek指定多长就移动多少个字节。而rewind每次都是回到文件的开始处。
那如何移动到最末尾呢?我们可以统计字节数。在fseek的时候直接移到回后。
下面我们来讲filesize统计字节数。
3.filesize 检测文件的大小
<?php $filename = 'demo.txt'; echo $filename . '文件大小为: ' . filesize($filename) . ' bytes'; ?>
4.其它操作文件的函数
其实还有一些其他操作文件的函数,读取文件
我们通过一个实例来把上面几个函数都用到。
我们在demo.txt文件中写入一批文件:
abcdeefghijklk
opqrst
uvwxyz
12345678
<?php //以增加的r模式打开 $fp = fopen('demo.txt','r+'); //你分发现每次只读一个字符 echo fgetc($fp); //我要全部读取可以,读取一次将结果赋值一次给$string while($string = fgetc($fp)){ echo $string; } ?>
fgets每次打开一行:
<?php //以增加的r模式打开 $fp = fopen('demo.txt','r+'); //你分发现每次只读一个字符 echo fgets($fp); echo fgets($fp); echo fgets($fp); echo fgets($fp); ?>
上面的代码,你会发现每次读取一次打开一行。读取最后返回的是false。
我们接下来看文件截取函数:
<?php //打开我们上面的demo.txt文件 $file = fopen("demo.txt", "a+"); //你可以数数20个字有多长,看看是不是达到效果了 echo ftruncate($file,20); fclose($file); ?>
上例中我们发现,截取多长就能显示多长的内容。
5.文件的时间函数
<?php $filename = 'demo.txt'; if (file_exists($filename)) { echo "$filename文件的上次访问时间是: " . date("Y-m-d H:i:s", fileatime($filename)); echo "$filename文件的创建时间是: " . date("Y-m-d H:i:s", filectime($filename)); echo "$filename文件的修改时间是: " . date("Y-m-d H:i:s", filemtime($filename)); } ?>
九、文件锁机制
文件锁机制一般在单一打开文件的时候根本看不到效果。这一块的学习有一点点抽象。
大家不要去思考怎么实现的呀?
为什么看不到效果呀?
答:因为电脑的操作太快了,基本上是毫秒级的。所以这个实验其实是看不到效果的。
这一章了解文件锁的基本概念即可,熟悉文件锁函数和锁机制。
文件锁的用途:
若一个人在写入一个文件,另外一个人同时也打个了这个文件进行写入文件。
这情况下,如果遇到一定的碰撞概率的话,不知道到底谁的操作为准。
因此,这个时候我们引入锁机制。
若用户A在写入或者读取这个文件的时候,将文件加上共享所。我可以读,其他人也可以读。
但是,我如果这与的时候。我使用独占锁。这个文件归我了,你们都别动,除非我将文件锁进行释放。
注意:不论加上了文件锁后要注意释放。
我们来看看这个函数:
bool flock ( resource $handle , int $operation)
功能:轻便的咨询文件锁定
我们来看看锁类型:
我们接下来把demo.txt加上一个独占锁,进行写入操作。
<?php $fp = fopen("demo.txt", "r+"); // 进行排它型锁定 if (flock($fp, LOCK_EX)) { fwrite($fp, "文件这个时候被我独占了哟\n"); // 释放锁定 flock($fp, LOCK_UN); } else { echo "锁失败,可能有人在操作,这个时候不能将文件上锁"; } fclose($fp); ?>
说明:
上例中我为了写入文件,把文件加上了独占锁。
如果我操作完成,写入完成后,解除掉了独占锁。
如果是在读取文件的时候,大家可加按照同样的处理思路加上共享锁。
十、目录处理函数
之前我们处理的全都是文件,那目录和文件夹怎么处理呢?
我们就来学习目录或者称为文件夹的处理相关函数。
处理文件夹的基本思想如下:
读取某个路径的时候判断是否是文件夹
是文件夹的话,打开指定文件夹,返回文件目录的资源变量
使用readdir读取一次目录中的文件,目录指针向后偏移一次
使用readdir读取到最后,没有可读的文件返回false
关闭文件目录
我们来学习一比常用函数:
<?php //设置打开的目录是D盘 $dir = "d:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取一次向后移动一次文件夹指针 echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; echo readdir($dh).'<br />'; //读取到最后返回false //关闭文件夹资源 closedir($dh); } } ?>
即然是读取一次向后移动一次,我们是不是可以
<?php //设置打开的目录是D盘 $dir = "d:/"; //判断是否是文件夹,是文件夹 if (is_dir($dir)) { if ($dh = opendir($dir)) { //读取到最后返回false,停止循环 while (($file = readdir($dh)) !== false) { echo "文件名为: $file : 文件的类型是: " . filetype($dir . $file) . "<br />"; } closedir($dh); } } ?>
十一、文件权限设置
文件权限设置的函数在系统管理级别的软件中很常用。例如:某个文件不准许guest组(来宾用户)查看呀。
在企业管理中,某些用户或者某些用户文件只准读取不准修改。这都是非常常用的功能。
注:
本章为了解章节。如果没有学习过linux会有些吃力,可以跳过本章,了解有这个东西即可。
在实际生产环节中用处较少。
主要针对在linux下有过全面知识体系的同学可以重点学习。
windows下面有些功能无法实现。
上面的函数用法与linux的权限操作的用法一样。
对于学过linux的同学来说学起来比较简单。没有学过的会有些吃力。
我只讲一个例子,看看如何来修改权限:
chmod 主要是修改文件的的权限
<?php //修改linux 系统/var/wwwroot/某文件权限为755 chmod("/var/wwwroot/index.html", 755); chmod("/var/wwwroot/index.html", "u+rwx,go+rx"); chmod("/somedir/somefile", 0755); ?>
十二、文件路径函数
1.情景重现
我们经常会遇到处理文件路径的情况。
例如:
文件后缀需要取出来
路径需要取出名字不取目录
只需要取出路径名中的目录路径
或者把网址中的各个部份进行解析取得独立值
甚至是自己组成一个url出来
... ....
很多地方都需要用路径处理类的函数。
我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:
2.Pathinfo
array pathinfo ( string $路径)
功能:传入文件路径返回文件的各个组成部份
我们用具体的示例来用一下:
<?php $path_parts = pathinfo('d:/www/index.inc.php'); echo '文件目录名:'.$path_parts['dirname']."<br />"; echo '文件全名:'.$path_parts['basename']."<br />"; echo '文件扩展名:'.$path_parts['extension']."<br />"; echo '不包含扩展的文件名:'.$path_parts['filename']."<br />"; ?>
结果如下:
文件目录名:d:/www
文件全名:lib.inc.php
文件扩展名:php
不包含扩展的文件名:lib.inc
3.Basename
string basename ( string $路径[, string $suffix ])
功能:传入路径返回文件名
第一个参数传入路径。
第二个参数,指定我文件名到了指定字符停止。
<?php echo "1: ".basename("d:/www/index.d", ".d").PHP_EOL; echo "2: ".basename("d:/www/index.php").PHP_EOL; echo "3: ".basename("d:/www/passwd").PHP_EOL; ?> 4.Dirname dirname(string $路径) 功能:返回文件路径的文件目录部份 <?php dirname(__FILE__); ?>
结论:你可以执行看看是不是返回了文件的目录部份。
5.parse_url
mixed parse_url ( string $路径 )
功能:将网址拆解成各个部份
<?php $url = 'http://username:password@hostname:9090/path?arg=value#anchor'; var_dump(parse_url($url)); ?>
结果如下:
array(8) {
["scheme"]=> string(4) "http"
["host"]=> string(8) "hostname"
["port"]=> int(9090)
["user"]=> string(8) "username"
["pass"]=> string(8) "password"
["path"]=> string(5) "/path"
["query"]=> string(9) "arg=value"
["fragment"]=> string(6) "anchor"
}
6.http_build_query
string http_build_query ( mixed $需要处理的数据)
功能:生成url 中的query字符串
<?php //定义一个关联数组 $data = [ 'username'=>'liwenkai', 'area'=>'hubei' ]; //生成query内容 echo http_build_query($data); ?>
结果如下:
username=liwenkai&area=hubei
http_build_url()
功能: 生成一个url
注:
PHP_EOL 常量
在 windows平台相当于 echo "\r\n";
在unix\linux平台相当于 echo "\n";
在mac平台相当于 echo "\r";
十三、文本留言本
我们讲完了这么多关于文件处理的系统,可是我们连一个最基本的小东西都写不出来。
从这一节开始,大家会发现大家能够写越来越多的东西了。
接下来我们我们来看看演示效果:
在下面一个界面中写入留言内容的表单界面:
存在留言后的展示界面:
我们来看一下文件结构:
index.php ---展示输入框和留言内容
write.php ---向message.txt写入数据
message.txt ---存入聊天内容
index.php文件
<?Php //设置时区 date_default_timezone_set('PRC'); //读了内容 @$string = file_get_contents('message.txt'); //如果$string 不为空的时候执行,也就是message.txt中有留言数据 if (!empty($string)) { //每一段留言有一个分格符,但是最后多出了一个&^。因此,我们要将&^删掉 $string = rtrim($string, '&^'); //以&^切成数组 $arr = explode('&^', $string); //将留言内容读取 foreach ($arr as $value) { //将用户名和内容分开 list($username, $content, $time) = explode('$#', $value); echo '用户名为<font color="gree">' . $username . '</font>内容为<font color="red">' . $content . '</font>时间为' . date('Y-m-d H:i:s', $time); echo '<hr />'; } } ?> <h1>基于文件的留言本演示</h1> <form action="write.php" method="post"> 用户名:<input type="text" name="username" /><br /> 留言内容:<textarea name="content"></textarea><br /> <input type="submit" value="提交" /> </form>
看了刚刚的展示内容,我们知道文件存储时:
段与段之间进行了分割
内容与用户之前用一个特殊的符号进行了分割
下面我们来写write.php写入留言至文件的代码:
<?php //追加方式打开文件 $fp=fopen('message.txt','a'); //设置时间 $time=time(); //得到用户名 $username=trim($_POST['username']); //得到内容 $content=trim($_POST['content']); //组合写入的字符串:内容和用户之间分开,使用$# //行与行之间分开,使用&^ $string=$username.'$#'.$content.'$#'.$time.'&^'; //写入文件 fwrite($fp,$string); //关闭文件 fclose($fp); header('location:index.php'); ?>