찾다
백엔드 개발PHP 튜토리얼 [愉快学php100天]第三天:不羁的PHP文件操作

[开心学php100天]第三天:不羁的PHP文件操作

本期格言:

  在当年还没有数据库存在的时候,读写文件是我们程序员在空虚的夜晚唯一能干的事情之一(也许不一定哦~~~)。所以即使现在这项技术变的有多么的简单、快捷和普通,我们依然要保持细致的态度和严格的操守,千万不要忽视它的重要性和严谨性。

 正文开始:

   关于读文件我有个小故事。早年工作室开办初期,正是业务慌的时候,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
终于等到更了,支持你哦~沙发~~~
성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
세션 고정 공격을 어떻게 방지 할 수 있습니까?세션 고정 공격을 어떻게 방지 할 수 있습니까?Apr 28, 2025 am 12:25 AM

세션 고정 공격을 방지하는 효과적인 방법은 다음과 같습니다. 1. 사용자 로그인 한 후 세션 ID 재생; 2. 보안 세션 ID 생성 알고리즘을 사용하십시오. 3. 세션 시간 초과 메커니즘을 구현하십시오. 4. HTTPS를 사용한 세션 데이터를 암호화합니다. 이러한 조치는 세션 고정 공격에 직면 할 때 응용 프로그램이 파괴 할 수 없도록 할 수 있습니다.

세션리스 인증을 어떻게 구현합니까?세션리스 인증을 어떻게 구현합니까?Apr 28, 2025 am 12:24 AM

서버 측 세션 스토리지가없는 토큰에 저장되는 토큰 기반 인증 시스템 인 JSONWEBTOKENS (JWT)를 사용하여 세션없는 인증 구현을 수행 할 수 있습니다. 1) JWT를 사용하여 토큰을 생성하고 검증하십시오. 2) HTTPS가 토큰이 가로 채지 못하도록하는 데 사용되도록, 3) 클라이언트 측의 토큰을 안전하게 저장, 4) 변조 방지를 방지하기 위해 서버 측의 토큰을 확인하기 위해 단기 접근 메커니즘 및 장기 상쾌한 토큰을 구현하십시오.

PHP 세션과 관련된 일반적인 보안 위험은 무엇입니까?PHP 세션과 관련된 일반적인 보안 위험은 무엇입니까?Apr 28, 2025 am 12:24 AM

PHP 세션의 보안 위험에는 주로 세션 납치, 세션 고정, 세션 예측 및 세션 중독이 포함됩니다. 1. HTTPS를 사용하고 쿠키를 보호하여 세션 납치를 방지 할 수 있습니다. 2. 사용자가 로그인하기 전에 세션 ID를 재생하여 세션 고정을 피할 수 있습니다. 3. 세션 예측은 세션 ID의 무작위성과 예측 불가능 성을 보장해야합니다. 4. 세션 중독 데이터를 확인하고 필터링하여 세션 중독을 방지 할 수 있습니다.

PHP 세션을 어떻게 파괴합니까?PHP 세션을 어떻게 파괴합니까?Apr 28, 2025 am 12:16 AM

PHP 세션을 파괴하려면 먼저 세션을 시작한 다음 데이터를 지우고 세션 파일을 파괴해야합니다. 1. 세션을 시작하려면 세션 _start ()를 사용하십시오. 2. Session_Unset ()을 사용하여 세션 데이터를 지우십시오. 3. 마지막으로 Session_Destroy ()를 사용하여 세션 파일을 파괴하여 데이터 보안 및 리소스 릴리스를 보장하십시오.

PHP의 기본 세션 저장 경로를 어떻게 변경할 수 있습니까?PHP의 기본 세션 저장 경로를 어떻게 변경할 수 있습니까?Apr 28, 2025 am 12:12 AM

PHP의 기본 세션 저장 경로를 변경하는 방법은 무엇입니까? 다음 단계를 통해 달성 할 수 있습니다. session_save_path를 사용하십시오 ( '/var/www/sessions'); session_start (); PHP 스크립트에서 세션 저장 경로를 설정합니다. php.ini 파일에서 세션을 설정하여 세션 저장 경로를 전 세계적으로 변경하려면 세션을 설정하십시오. memcached 또는 redis를 사용하여 ini_set ( 'session.save_handler', 'memcached')과 같은 세션 데이터를 저장합니다. ini_set (

PHP 세션에 저장된 데이터를 어떻게 수정합니까?PHP 세션에 저장된 데이터를 어떻게 수정합니까?Apr 27, 2025 am 12:23 AM

tomodifyDatainAphPessess, startSessionstession_start (), 그런 다음 $ _sessionToset, modify, orremovevariables.

PHP 세션에 배열을 저장하는 예를 제시하십시오.PHP 세션에 배열을 저장하는 예를 제시하십시오.Apr 27, 2025 am 12:20 AM

배열은 PHP 세션에 저장할 수 있습니다. 1. 세션을 시작하고 session_start ()를 사용하십시오. 2. 배열을 만들고 $ _session에 저장하십시오. 3. $ _session을 통해 배열을 검색하십시오. 4. 세션 데이터를 최적화하여 성능을 향상시킵니다.

Garbage Collection은 PHP 세션에 어떻게 효과가 있습니까?Garbage Collection은 PHP 세션에 어떻게 효과가 있습니까?Apr 27, 2025 am 12:19 AM

PHP 세션 쓰레기 수집은 만료 된 세션 데이터를 정리하기위한 확률 메커니즘을 통해 트리거됩니다. 1) 구성 파일에서 트리거 확률 및 세션 수명주기를 설정합니다. 2) CRON 작업을 사용하여 고재 응용 프로그램을 최적화 할 수 있습니다. 3) 데이터 손실을 피하기 위해 쓰레기 수집 빈도 및 성능의 균형을 맞춰야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Dreamweaver Mac版

Dreamweaver Mac版

시각적 웹 개발 도구

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)