2011-05-14 97 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

相关问题