最大执行时间超过30秒

时间:2011-05-14 07:26:35

标签: php

当我运行脚本时,我会在处理所有数据行之前收到以下错误。

  

最长执行时间为30秒   超过

在研究问题之后,我应该能够延长应该解决问题的max_execution_time时间。

但是,在我的PHP编程初期,我想知道下面是否有更优化的方式来执行我的脚本,所以我不必依赖“退出监狱卡”。

脚本是:

1拍摄CSV文件

2樱桃采摘一些专栏

3尝试将10k行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();
?>

3 个答案:

答案 0 :(得分: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命令。

答案 1 :(得分: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);

但这取决于您的查询将持续多长时间以及服务器限制的设置。

但正如您可以在其他帖子中阅读的那样,有更好的方法满足您的要求。但我知道我应该分享你想到的方式。

答案 2 :(得分:0)

您可以在插入之前尝试调用以下函数。这会将时间限制设置为无限制,而不是默认时间为30秒。

set_time_limit( 0 );