通过php写个API将txt文件中的数据写入到数据库中

现在项目需要写个API将txt文件中的数据写入到数据库中。txt文件格式如下
1 测试数据一 English
2 测试数据二 chinese
3 测试数据三 American

现在通过下面代码修改后插入
$conn = mysql_connect('127.0.0.1','root','') or die("Invalid query: " . mysql_error());
mysql_select_db('test', $conn) or die("Invalid query: " . mysql_error());

$content = file_get_contents("serial_number.txt");
$contents= explode(",",$content);

foreach ($contents as $k => $v)
{
$id = $k;
$serial_number = $v;
mysql_query("insert into serial_number (id,serial_number)

  VALUES('$id','$serial_number')");

}
插入数据量较小的时候没什么问题,但是如果现在有30万的数据似乎这样不是很好,想请假一下大家有没有更好些的办法

阅读 3.4k
3 个回答

只需要改变文件读取方式就可以了, 不要用 file_get_contents() 方法, 那会把整个文件一次性读入内存. 改为逐行读取就可以了:

<?php
$handle = @fopen("serial_number.txt", "r");
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        $contents = explode(",",$line);
        // 在这里把数据插入 mysql.
    }

    fclose($handle);
} else {
    // error opening the file.
} 
?>

如果想进一步优化, 有几个方向可以考虑:

  • 解析多行数据, 一次性插入 mysql, 比如每次插入 50 条数据.
  • 因为 php 模型简单, 不支持多线程. 所以如果对时间要求高, 可以多起几个进程, 分段读取文件. 一般我做这类需求, 会首先考虑 python, 因此确实没用过 php 读取特定行. 翻了下文档, 可参考 SplFileObject 这个类, 具体请自行研究下.
参考:
官方文档 - file_get_contents()
官方文档 - fgets()
官方文档 - SplFileObject

LOAD DATA / mysqlimport
或者PHP更改读取方式 yield

推荐问题