我需要运行一个每日cron作业,该作业遍历一个6 MB CSV文件,以将每个〜10,000个条目插入MySQL表中。我写的代码挂起并在一段时间后产生一个超时。PHP将大型CSV文件导入到MySQL表中
if (($handle = fopen($localCSV, "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$dbdata = array(
'SiteID' => $siteID,
'TimeStamp' => $data[0],
'ProductID' => $data[1],
'CoordX' => $data[2],
'CoordY' => $data[3]
);
$row++;
$STH = $DBH->prepare("INSERT INTO temp_csv (SiteID,TimeStamp,ProductID,CoordX,CoordY) VALUES (:SiteID,:TimeStamp,:ProductID,:CoordX,:CoordY)");
$STH->execute($dbdata);
}
fclose($handle);
echo $row." rows inserted.";
}
这本来是理想的使用mysql_*
功能,而不是PDO,这样我就可以爆的值到一个单独的查询(尽管巨大的),但不幸的是我需要遵守一些准则(PDO的使用仅限) 。
我搜索了,所以有非常类似的问题,但没有人能解决我的问题。我尝试的是以下内容:
1-冉LOAD DATA INFILE
和LOAD DATA LOCAL INFILE
查询,但不断收到“文件未找到”错误,虽然该文件肯定是有777权限。数据库服务器和共享主机帐户处于不同的环境中。我尝试了csv文件的相对路径和url路径,但没有运气(在两种情况下都找不到文件)。
2-我将csv文件拆分为2个文件,并在每个文件上运行脚本,查看脚本挂起的阈值,但是在每个文件的情况下,它在表格中插入了两次条目。
我无权访问php.ini
,因为它是共享的托管帐户(cloudsites),并且只能通过phpMyAdmin访问MySQL
。
我还有什么可以尝试尽可能有效地完成这项工作?
任何帮助表示赞赏。
我经常处理.csv - > mysql,我的一般策略是每个插入记录多个记录,例如,插入表值(一,二),(三,四),(五,六)等。 – Dave
做一个批量插入会更好,而不是每行一个插入。 – user602525
感谢@Dave,但是我怎样才能在while循环中使用PDO呢?它会使用'mysql_ *',但我不能使用它。 –