当我运行脚本时,我会在处理所有数据行之前收到以下错误。
最长执行时间为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();
?>
答案 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 );