2012-12-16 163 views
-2

我有一個csv文件,包含65000條記錄,需要導入到我的數據庫中。php將csv導入數據庫

我試過下面的代碼,但真的很慢。

無論如何,我可以做得更快。

@set_time_limit(1200); 
    $file = './csvFiles/aw_Products.csv'; 
    $handle = fopen($file , 'r'); 
    while (($row = fgetcsv($handle)) !== false) {  
     if(is_integer($row[0]) || $row[0] != 0) 
     { 
      $product = new Product(); 
      $product->merchant_id  = $row[0]; 
      $product->merc_product_id = $row[1]; 
      $product->product_id  = $row[2]; 
      $product->product_name  = $row[3]; 
      $product->product_desc  = htmlentities($row[4]); 
      //$product->keywords   = htmlentities($row[6]); 
      $product->category_id  = $row[5]; 
      $product->link_url   = $row[6]; 
      $product->image_url   = $row[7]; 
      $product->price    = $row[8]; 
      $product->delivery_cost  = $row[9]; 
      //$product->deliveryAvailable = $row[12]; 
      //$product->deliveryDetails = $row[13]; 
      //$product->valid_to   = $row[14]; 
      //$product->valid_from  = ($row[3] == 'yes') ? 1 : 0; 

      if(Product::find_by_id($row[0])) 
       $product->updateRecord(); 
      else 
       $product->createRecord(); 
     } 
     sleep (1); 
    } 
    fclose($handle); 
+1

也許這是更合適的:http://stackoverflow.com/questions/9057377/import-csv-or-xml-to-mysql –

+4

什麼是'睡眠(1);'爲?你叫它65000次,所以當然可能需要一段時間。 –

+0

嘗試放置此代碼 - > $ product = new Product()循環外。 – Yagi

回答

2

sleep()可能是罪魁禍首。但我也想知道這個:Product::find_by_id(),因爲它可能會爲每個INSERT執行SELECT查詢。您可能會考慮製作一個SELECT查詢以將所有現有數據庫密鑰都獲取到PHP數組中,然後可以使用* in_array()*來檢查是更新還是插入。大概不言而喻,但是如果你插入了,你會想添加到PHP數組中。

1

放棄睡眠()並使用mysql語句插入/更新預處理語句。