php 使用file_get_contents读取大文件的方法

php 使用file_get_contents读取大文件的方法,第1张

当我们遇到文本文件体积很大时,比如超过几十M甚至几百M几G的大文件,用记事本或者其它编辑器打开往往不能成功,因为他们都需要把文件内容全部放到内存里面,这时就会发生内存溢出而打开错误,遇到这种情况我们可以使用PHP的文件读取函数file_get_contents()进行分段读取。

函数说明

string

file_get_contents

(

string

$filename

[,

bool

$use_include_path

[,

resource

$context

[,

int

$offset

[,

int

$maxlen

]]]]

)

file()

一样,只除了

file_get_contents()

把文件读入一个字符串。将在参数

offset

所指定的位置开始读取长度为

maxlen

的内容。如果失败,file_get_contents()

将返回

FALSE。

file_get_contents()

函数是用来将文件的内容读入到一个字符串中的首选方法。如果 *** 作系统支持还会使用内存映射技术来增强性能。

应用:

复制代码

代码如下:

$str

=

$content=file_get_contents("2.sql",FALSE,NULL,1024*1024,1024)

echo

$str

如果针对较小文件只是希望分段读取并以此读完可以使用fread()函数

复制代码

代码如下:

$fp=fopen('2.sql','r')

while

(!feof($fp)){

$str.=fread($fp,

filesize

($filename)/10)//每次读出文件10分之1

//进行处理

}

echo

$str

思路:

读取csv文件,每读取一行数据,就插入数据库

示例

文件夹结构

/

 file.csv    //csv大文件,这里只模拟三行数据,不考虑运行效率(PS:csv文件格式很简单,文件一般较小,解析很快,运行效率的瓶颈主要在写入数据库 *** 作)

 index.php    //php文件

file.csv

singi,20

lily,19

daming,23

index.php

/**

 * 读取csv文件,每读取一行数据,就插入数据库

 */

//获取数据库实例

$dsn = 'mysql:dbname=testhost=127.0.0.1'

$user = 'root'

$password = ''

try {

    $db = new PDO($dsn, $user, $password)

} catch (PDOException $e) {

    echo 'Connection failed: ' . $e->getMessage()

}

//读取file.csv文件

if (($handle = fopen("file.csv", "r")) !== FALSE) {

    while (($row = fgetcsv($handle, 1000, ",")) !== FALSE) {

        //写入数据库

        $sth = $db->prepare('insert into test set name=:name,age=:age')

        $sth->bindParam(':name',$row[0],PDO::PARAM_STR,255)

        $sth->bindParam(':age',$row[1],PDO::PARAM_INT)

        $sth->execute()

    }

    fclose($handle)

}

数据表

CREATE TABLE `test` (

`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

`name` VARCHAR(255) NULL DEFAULT '' COLLATE 'utf8mb4_bin',

`age` INT(10) NULL DEFAULT '0',

PRIMARY KEY (`id`)

)

COLLATE='utf8mb4_bin'

ENGINE=InnoDB

运行结束后,数据库中会插入csv中的三行数据

<?

// 打开文件同时,打印每一行 $myFile = file( "100001.txt")//用file()函数读取文本文件的内容。 for($index = 0$index <count($myFile)$index++)

{

print($myFile[$index]." ")//循环输出

}

?>修改如下:

$myFile = file( "100001.txt")//用file()函数读取文本文件的内容。

//设置分页

$page=is_numeric($_REQUEST['page'])?$_REQUEST['page']:1

$page_size=3//每页显示三行

//第一页,显示1-3行,对应的for循环起止条件是0-3

//第二页,显示4-6行,对应的for循环起止条件是3-6

//可以看出for循环的条件分别是首项为0与首项为3,公差为3的等差数列,以下分别是公式

$off=3*($page-1)

$off_size=3*$page

$total_page=ceil(count($myFile)/$page_size)//总页数 /

/ 打开文件同时,打印每一行

for($index = $off$index <$off_size$index++)

{

echo iconv('gb2312','utf-8',$myFile[$index])."<br>"//循环输出

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12033301.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存