2011-05-14 177 views
1

當我運行腳本時,在處理所有數據行之前,我收到以下錯誤。 30秒 超過30秒的最大執行時間php

最大的執行時間超過

研究這個問題後,我應該能夠延長的max_execution_time時間,這應該解決問題。

但是,在我的PHP編程初期,我想知道是否有更好的方式來做我的腳本,所以我不必依靠「走出監獄卡」。

的腳本是:

1以CSV文件

2櫻桃採摘一些列

3試圖插入10,000行的CSV數據到我的SQL表

在我頭我想我應該可以插入大塊,但這遠遠超出了我的技能,我甚至不知道如何寫一行:\

很多在此先感謝

<?php 
function processCSV() 
{ 
    global $uploadFile; 
    include 'dbConnection.inc.php'; 
    dbConnection("xx","xx","xx"); 
    $rowCounter = 0; 
    $loadLocationCsvUrl = fopen($uploadFile,"r"); 
    if ($loadLocationCsvUrl <> false) 
    { 
     while ($locationFile = fgetcsv($loadLocationCsvUrl, ',')) 
     { 
      $officeId = $locationFile[2]; 
      $country = $locationFile[9]; 
      $country = trim($country); 
      $country = htmlspecialchars($country); 
      $open = $locationFile[4]; 
      $open = trim($open); 
      $open = htmlspecialchars($open); 
      $insString = "insert into countrytable set officeId='$officeId', countryname='$country', status='$open'"; 
       switch($country) 
       { 
        case $country <> 'Country': 
         if (!mysql_query($insString)) 
         { 
          echo "<p>error " . mysql_error() . "</p>";  
         } 
         break; 
       } 
      $rowCounter++; 
     } 
     echo "$rowCounter inserted."; 
    } 
    fclose($loadLocationCsvUrl); 
} 
processCSV(); 
?> 
+0

您是否需要這樣做一次或者您是否每隔一段時間在數據庫中插入10k行? – 2011-05-14 07:28:54

+0

另外,你是通過網絡服務器運行它,即你是從瀏覽器調用頁面,還是通過命令行運行它? – stevecomrie 2011-05-14 07:31:15

+0

@Salman A>它可能會每月做2或3次 – user752336 2011-05-14 07:41:36

回答

3

首先,在2011年你不使用的mysql_query。您使用mysqli或PDO並準備好語句。那麼你不需要弄清楚如何爲SQL轉義字符串。您使用了htmlspecialchars,這是完全錯誤的。接下來,您可以使用事務來加速插入。 MySQL還支持多種興趣。

但最好的選擇是使用CSV存儲引擎。 http://dev.mysql.com/doc/refman/5.0/en/csv-storage-engine.html在這裏閱讀。您可以立即將所有內容加載到SQL中,然後如您所願在其中進行操作。文章還顯示了load data infile命令。

+0

謝謝我從來沒有聽說過我會研究實現它的「CSV存儲引擎」,對於我這些糟糕的代碼感到抱歉,我對這一切仍然陌生,而且我已經閱讀過舊書。 – user752336 2011-05-14 08:17:01

0

您可以嘗試在插入之前調用以下函數。這會將時間限制設置爲無限制,而不是30秒的默認時間。

set_time_limit(0);

+0

問題是如何在不改變時間限制的情況下解決問題。 – Arjan 2011-05-14 07:36:15

1

那麼,你可以創建一個這樣的單個查詢。

$query = "INSERT INTO countrytable (officeId, countryname, status) VALUES "; 
$entries = array(); 
while ($locationFile = fgetcsv($loadLocationCsvUrl, ',')) { 
    // your code 
    $entries[] = "('$officeId', '$country', '$open')"; 
} 

$query .= implode(', ', $enties); 
mysql_query($query); 

但是,這取決於您的查詢的時間和服務器限制設置爲什麼。

但是,正如你可以在其他職位閱讀,有更好的方式爲您的要求。但我想你應該分享一下你的想法。

+0

我正要說同樣的話。我最近從一個mysqldump文件中將大約3分鐘的1.3GB數據導入到mysql中。 10k記錄不應該是一個多重插入語句的問題,但您仍然應該將其分解爲每插入500行的批處理。 – 2011-05-14 07:50:37

+0

謝謝,這已經造成了重大差異 – user752336 2011-05-14 08:15:22

相關問題