我需要運行一個每日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_ *',但我不能使用它。 –