相似于c语言读取文件进行解析

 

 

 

        $log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/'.date('Ym').'/'.date('d').'_error.log';
    
        //$log_file_name = 'D:/static/develop/kuai_zhi/acagrid.com/public/Logs/201701/19_error.log';
 
         
        if(!file_exists($log_file_name)) return;

        
        $handle = fopen($log_file_name,'rb');
         if (FALSE === $handle) {
             exit("Failed to open stream to URL");
         }
         
//        $stream = fread($handle, $length);//从文件当前指针位置,日后读取n个字节长度

         //重置文件指针的位置。指定指针的位置,指针位置修改后。读取文件,后面是从这个位置开始读取了
         //fseek($handle,105);函数

         //fgets表示每次读取文件的一行spa

 


         $error_log_array = [];
         while(  ($line = fgets($handle) )  !==false){
             //每次读取一行
             
             //匹配出现[1],tp日志中用这种表示致命错误类型
             if(preg_match("/\[1\]/", $line)){
                 $error_log_array[] = $line;
             }
             
         }
         
         fclose($handle);指针

 

 

 

 

 

 

 


须要注意的几个点:

一、若是是使用fwrite,注意避免将原来文件的内容清空掉了。关键是fopen的打开方式。r或者w。

若是使用追加方式则是a标记。

二、fopen的时候,注意判断是否成功打开文件。避免使用feof的时候进入死循环。由于这个函数,当传入进去不是指针,则这个函数永远会返回false

feof的本意是:判断是否为文件结尾。若是是结尾,则返回true。不是结尾返回false。若是刚好传入非法的指针,那么永远不是文件结尾了,一直返回

false。
日志

 

feof()函数,当传入进去的不是指针类型的时候,使用以下判断会出现死循环get

while(!feof($fp)){it

}stream

 

 


三、fread和fgets。读取文件一行一行读取,则使用fgets。不是按照行读取,则使用fread()读取。date

     要注意这一点细节:若是没有更多的内容,则返回false,也就是两种状况,若是里面的内容为空。也会返回false。当读取到文件的结尾的时候,这两个函数也是返回false(难怪咱们使用feof()使得咱们不会发现这个细节,由于这个函数已经帮助咱们判断文件结尾了)file

 

  

四、使用追加方式(即a标记)打开文件,要注意,这种方式下,没法读取文件内容的,只能往里面写入文件。因此针对这个句柄进行fread()是会获得false的

grid

总结是,若是只是仅仅读取文件的内容,就只用读的方式打开,若是是写入新内容进去,则用a的方式打开

 

如今明白,为何要分多种模式进行区分了。之前以为没有用。如今看来,打开的文件方式决定了,你可以针对文件作什么(添加新内容仍是读取内容。)

相关文章
相关标签/搜索