本期格言:
在当年还没有数据库存在的时候,读写文件是我们程序员在空虚的夜晚唯一能干的事情之一(也许不一定哦~~~)。所以即使现在这项技术变的有多么的简单、快捷和普通,我们依然要保持细致的态度和严格的操守,千万不要忽视它的重要性和严谨性。
正文开始:
关于读文件我有个小故事。早年工作室开办初期,正是业务慌的时候,QQ上某好友介绍说他有个朋友单位要做网站,介绍给我做。我一听很激动,立马整理发型掐灭烟头,因为我朋友说那个客户等下要和我视频(这么潮?)。又据说他是大企业的IT主管,很正规,要我重视一下,不要太颓废。我特意拿出电动剃须刀刮了胡子。
我当时很喜欢这种几千大洋的网站生意,基本上是排排界面做做css,不超过100句php代码。派个新手一个星期搞定即可,虽然可复用性和后续业务拓展根本谈不上,但是一个月的烟酒茶钱肯定到手了。当然谈肯定得我去谈,让新手去谈,我晚上基本上只能在大排档吃麻辣烫了。
视频开,对面出现一个清秀男子,长相委婉,声带很细。互相很假的客套后,他骄傲的介绍了一下他所在的厂,很大,由于发展规模太快太快太快太快,现在想做一 个网站(我不知规模太快和想做网站有何太大联系)来贴合规模,末了发给我一个Excel,已经画好了网站首页结构图,以前公司的小软件都是他做的,由于他最近太忙太忙太忙太忙,所以这次想找个网络公司开发了,话末清秀男委婉的告诉我,他技术方面“很懂的哦~"。
一阵冷风吹过~~~。
我点开Excel,我佩服清秀男的“素描”功底,能在Excel把页面结构图画出来并且还能画的这么形象的实属少见。我表示认可,并说能按时交货,同时我已经把该Excel发给了我的美工兼程序员,让他照做,时间是3天。不过接下来清秀男的要求让我差点想把台式机显示屏给盖上,他的要求是把图片和文字直接贴在Excel里面,然后在该Excel里面建立多个工作簿(当时我已经蒙了,不知道该用$sheet还是shit来表达”工作簿“),首页只需一个 PHP页面,根据他的设定分别读取Excel里面的工作簿。这样就可以做到每隔一段时间用户打开的首页都是不同的。从而多角度展现了他们厂业务的”多元化 “和创新。
清秀男在视频中得意的笑容让我很大限度上对我自己关于”可配置化、产品化“的设计思路有很大怀疑。我想拒绝这种外星人式的思维,可是清秀男坚持他的”理念“,他说他的设计已经得到他厂长充分的”高度评价“。
由于清秀男”转账支票“的魔力,让我臣服了与他的这种”可配置化“思路。我只想说,他太牛了,我做不了大型企业的IT主管,是因为我真想不出用这种办法来实现CMS概念中的模板切换。
当然我也不是傻子(读Office文件可不是很简单的事情),我用了一个很简单的办法解决此问题。并顺利的得到了转账支票。方法很简单,用html基本页面设计五个不同的清秀男要求的页面,然后另存为5个不同的Excel(注意:虽然保存的文件后缀是xls,但其实还是html文件),用php分别读取文件展示之。当时的代码如下:
$fileIndex=rand(1,5); //取一个随机数,范围是1到5
$fileName='index'.$fileIndex.'xls'; //拼凑一个文件名,注意:从index1.xls.....index5.xls都放在网站根目录下,和index.php同级
$getIndex=file_get_contents($fileName); //读取文件,
exit($getIndex); //输出读取文件的内容,并展示出来
?>
这里有几个知识点:
1、rand 函数
取随机数,参数是范围rand(最小值,最大值)。例子中 就是从1到5 随机产生一个数字。然后拼凑一个文件名。如index1.xls,index2.xls,index3.xls,index4.xls,index5.xls,代表了我为清秀男设计了5个页面分别另存了5个xls文件。
既然讲到了rand函数,就不得不扩展一下知识点: array_rand函数,(数组--array 我们在上一天已经唾沫横飞的讲过了,这里就不赘述了)
上面随机拼凑文件的方式还可以用下面的方式
$file=array("index1.xls","index2.xls","index3.xls","index4.xls","index5.xls");
$fileName='index'.$file[array_rand($file,1)].'xls';
这说明 array_rand返回的是传入的数组的键值,而第二个参数代表返回几个。如果是1则返回的是一个字符或数字变量,如果超过1,则会返回一个数组,该数组里面会包含2个随机键值。
2、file_get_contents函数
这个函数很重要,我们绝对要记住,也是我们非常常用的一个文件内容读取函数。它代表一次性把文件里面的内容读取出来,并读取成数组。
记住:一次性。读的过程中你没法干涉它。你想让它读到一半停下来干点其他事情,两个字“不行”。
记住:返回一定是一个字符串。
如 $getFileContent=file_get_contents("index1.xls"); 这说明 清秀男的要求我满足了。
这个函数的原型是:file_get_contents(path,include_path,context,start,max_length)
path:文件的路径,记住是从当前你“代码”最终执行的页面开始计算路径,这里"./"代表当前目录,"../"代表上一级目录,"http://www.cnblogs.com/http://www.cnblogs.com/http://www.cnblogs.com/" 这个代表上N级目录(麻烦自己数一下吧)
include_path:很多教材和网上的文章都带了一句如果要用include_path就填1。其他没了。我想在这山寨横行的年代,大家抄的太厉害了。其实include_path 是一个可设置环境变量,你可以用set_include_path设置,也可以用get_include_path获得。作用是什么呢其实很简单,include_path就是你设置的一堆文件夹路径,为了引用或者索引方便。以上面这个例子,譬如你的网站部署在 D:/web/,里面有个index.php, 理论上你的index1..index5.xls 也会放在D:/web/,这样读取只需要用file_get_contents("index1.xls").就可以,但是假设清秀男一定要你放在其他目录也就是不放在网站目录下,
譬如是 c:/清秀男的BT文件/ ,我们千万不能写 file_get_contents("c:/清秀男的BT文件/index1.xls"); 原因很简单:在纯洁的程序中出现"清秀男“三个字是多么的猥琐,再一个将来网站移植到Linux中就运行不起来了。
正确的方式是修改 php.ini
include_path = .:c:/清秀男的BT文件:./其他文件夹。移植到Linux中改配置文件即可。
这样的话 上面的程序 依然可以写成 file_get_contents("index1.xls",1); 尽管同级文件夹没有index1.xls,但是系统会在c:/清秀男的BT文件/下去寻找index1.xls。
context:这是一个神一样的参数。很多教材都是这么说的:"一套可以修改流的行为的选项"。这句话比教科书上"资本主义”的概念以及另外一个同类某“主义”的概念解释还要难懂。
实际上这个参数是这样的。file_get_contents不光可以读取本地文件,还能读取web文件。如我们要读取www.shenyisyn.org(注:作者简陋的工作室网站)首页源码,这时我们会需要设定一些参数,如http参数:
$options = array(
'http'=>array(
'method'=>'GET',//代表使用GET模式访问
'header'=>'Content-Type:text/html;charset=gb2312'.PHP_EOL.//代表编码是中文gb2312
'Cookie:xxxxx'.PHP_EOL //带cookie,假如你要攻击我的网站 很可能会用到哦
)
);
$context = stream_context_create($options);
然后就可以使用file_get_contents("www.shenyisyn.org",0,$context"); 来直接获取了。
由于真正要获取网页内容不推荐使用这个函数,并且也没有真正的爬虫或者索引软件会使用php来干,因此这里就不多扩展解释这个函数在获取远程地址时的用法。php应该让它干它最适合的事情,尤其我看到有些大牛用php桌面运行库来做桌面软件,Jesus Christ,钻研精神值得赞扬,但是绝不推荐大家花过多精力去研究。有多余的时间带带孩子骗骗老婆吧,或者大家一起讨论讨论如何“更进一步深化和发扬”精神文明建设来的更实际和高尚。
start,max_length:开始索引和获取最大字节数。很好理解但也没啥太大用。
3、PHP_EOL
这个知识点还是有点小重要的。
\n 软回车:在Windows 中表示换行且回到下一行的最开始位置。在Linux、unix 中只表示换行,但不会回到下一行的开始位置。
\r 软空格:
在Linux、unix 中表示返回到当行的最开始位置。在Mac OS 中表示换行且返回到下一行的最开始位置,相当于Windows 里的 \n 的效果。
\t 跳格(移至下一列)
它们在双引号或定界符表示的字符串中有效,在单引号表示的字符串中无效。
\r\n 一般一起用,用来表示键盘上的回车键(Linux,Unix中),也可只用 \n(Windwos中),在Mac OS中用\r表示回车!\t表示键盘上的“TAB”键。
文件中的换行符号:windows : \n linux,unix: \r\n
废话了很久了,总结一下就是为了保证将来移植到不同平台方便。大家应该用 PHP_EOL来代替 \r或者\n或者\r\n. PHP会在不同平台中帮你自动解析。程序员一定要学会把繁琐的事情交给系统来做。不要去记这些很有可能会搞混的东西。
4、PHP中文件处理的其他函数,这里简单列举一下,因为一般真实项目中很少会对文件做过多的操作,所以有的函数用的真心不是很多。因此下面只是列举一下:
- file(path,include_path,context) ---把文件读取,并读取成数组,根据换行符分割。上一天交过,这个函数真心不错,对于txt文件,直接可以读取成数组,省的我们还要根据换行符进行分隔。
- fopen(filename,mode,include_path,context).打开文件并返回句柄。有人会问 什么叫句柄,
$file=fopen("文件名"); 这个$file就是句柄。譬如,我的名字叫沈逸,我就是这个文件,而我的名字就是句柄。没有特殊含义,不要过于纠结,否则太纠结晚上容易起夜次数太多。
- fwrite(file,string,length) .写文件函数。大家可以通过度娘 看一下 file_put_contents和这个函数的区别。
- readfile(filename,include_path,context) 该函数读入一个文件并写入到输出缓冲.这个函数的特点是还会输出 读取文件的字节数。我很少用,因为以前很菜的时候把它当成了file_get_contents这个函数,结果在页面中始终出现了一个诡异的数字,经过我日夜反思才发现了端倪,懊恼无比。
- filesize 返回文件大小(字节数). 这个函数有用,但是它会有缓存。为啥呢?譬如按照清秀男的要求,测算了index1.xls的文件大小是12306KB,不小心我吃顿饭的时间,清秀男手工把index1.xls加了点数据或者删了,我如果吃完饭再来执行filesize('index1.xls')会发现还是12306KB。这就是缓存,清楚缓存需要使用clearstatcache();函数如
$size=filesize('index1.xls');
echo $size;
.....这里清秀男悄悄的来修改了,修改完后,很不负责任的回家洗洗睡了。。。。
clearstatcache();//我必须清一下缓存。
echo filesize('index1.xls'); //这样就对了,
- feof(file) 函数检测是否已到达文件末尾。不常用,官方教材上说对于未知长度文件的遍历很有用,有误导。用php绝对不应该去操作一些“未知长度”的文件,这不是php该干的事情。
- unlink(filename,context) 删除文件 。不说了,我不懂你都会懂的。
- copy(source,destination) 拷贝文件。记住一点就好:文件没有就没有,有就有,反正一句话“果断的会覆盖”。
- mkdir(path,mode,recursive,context) 创建目录。这个很好理解 ,主要要注意mode:默认全部权限。还有是recursive:是否递归。譬如你要创建 1/2/3/4/5 这样层级的文件夹,其实最关键的是你要创建“5”这个文件夹,如果这个参数是false,那么如果前面的1/2/3/4没有那么会创建失败,如果设置了true,系统会自动帮你把1/2/3/4/一起给创建了。
- rmdir(path). 删除文件夹 。话说这个函数还是安全。文件夹假如不是空的,它鸟都不会鸟你。
先写这么多,这里包含了大部分php文件的操作,当然还有很多,由于篇幅不全部列举,欢迎大家补充有故事、有特点、需谨慎使用的文件操作函数。若上文中有不到、不当、不足、胡扯的部分请谅解和指正。
- 1楼Ivan_hy昨天 09:53
- 终于等到更了,支持你哦~沙发~~~
相关文章推荐
• 【腾讯云】年中优惠,「专享618元」优惠券!• array怎样合并成这样,帮忙,该怎么处理 • urlencode转义字符串的有关问题 • 求destoon二次开发的学习资料,该如何处理 • Ajax实时刷新有关问题 • 50分~哪位高手有mysql5.0的windows下的安装包?上传一下~独孤九贱(3)_JavaScript视频教程
javascript是运行在浏览器上的脚本语言,连续多年,被评为全球最受欢迎的编程语言。是前端开发必备三大法器中,最具杀伤力。如果前端开发是降龙十八掌,好么javascript就是第18掌:亢龙有悔。没有它,你的前端生涯是不完整的。《php.cn独孤九贱(3)-JavaScript视频教程》课程特色:php中文网原创幽默段子系列课程,以恶搞,段子为主题风格的php视频教程!轻松的教学风格,简短的教学模式,让同学们在不知不觉中,学会了javascript知识。
JavaScript教程125240次播放
独孤九贱(6)_jQuery视频教程
jQuery是一个快速、简洁的JavaScript框架。设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。 核心特性可以总结为:具有独特的链式语法和短小清晰的多功能接口;具有高效灵活的css选择器,并且可对CSS选择器进行扩展;拥有便捷的插件扩展机制和丰富的插件。兼容各种主流浏览器,如IE 6.0+、FF 1.5+、Safari 2.0+、Opera 9.0+等,是全球最流行的前端开发框架之一。PHP中文网根据最新版本,独家录制jQuery最新视频教程,回馈PHP中文网的新老用户。
jQuery教程103615次播放
jQuery与Ajax基础与实战
jQuery是最流行的JS函数库,封装了许多实用的功能,其中最引人入胜的就是Ajax。 jQuery中的Ajax操作,语法简单,操作方便,使Ajax从未如此轻松,前端人员从此不再为与服务器异步交互而发愁,本套课程,精选了最常用的几个方法,从基本的语法到每个参数,再到具体实例进行了全面的讲解。
AJAX教程4744次播放
Git教程(60分钟全程无废话版)
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持
JavaScript教程4067次播放