我是PHP的新手 我正在尝试将大量的14MB .csv加载到mysql表中。 但它没有完全上传到db,可能是由于大文件(~400000行)。 ERROR页面花了太长时间才响应。
有没有更快的方法呢。
我的数据库在Amazon RDS上,PHP在EC2上。
我目前的代码是
<?php
header('Access-Control-Allow-Origin: *');
require "../config.php";
//$user_id = $_REQUEST['user_id'];
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// path where your CSV file is located
define('CSV_PATH','./');
$csv_file = CSV_PATH . "data_unique.csv";
if (($handle = fopen($csv_file, "r")) !== FALSE) {
fgetcsv($handle);
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
for ($c=0; $c < $num; $c++) {
$col[$c] = $data[$c];
}
$col1 = $col[0];
$col2 = $col[1];
$col3 = $col[2];
$col4 = $col[3];
$col5 = $col[4];
$col6 = $col[5];
// SQL Query to insert data into DataBase
$query = "INSERT INTO uniqueid_master(autoid,package_id,unique_id,user_id,issued,book_code) VALUES('".$col1."','".$col2."','".$col3."','".$col4."','".$col5."','".$col6."')";
$result = $conn->query($query);
}
fclose($handle);
}
echo "File data successfully imported to database!!";
$conn->close();
?>
答案 0 :(得分:1)
我认为你应该尝试LOAD DATA Mysql语句。这将非常快,因为你不必将所有内容都读入php。
mysqli_query($dblink, '
LOAD DATA LOCAL INFILE "'.$file.'"
INTO TABLE transactions
FIELDS TERMINATED by ","
OPTIONALLY ENCLOSED BY "\'"
LINES TERMINATED BY "\n"
');
也可以这样写:
$sql = "LOAD DATA LOCAL INFILE '/path/to/file.csv'
REPLACE INTO TABLE table_name FIELDS TERMINATED BY ','
ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES";
$result = $mysqli->query($sql);
OR
对于替代方法:请参阅此question
答案 1 :(得分:0)
这将改善一些PHP性能变量。
ini_set('memory_limit','-1');
ini_set('max_execution_time', 0);
这可能会解决您的问题。但是,仍然有可能,你会遇到内存错误。在这种情况下,将csv文件分成多个块并一个接一个地处理它们。 这是处理它的好方法。