長話短說,如果我打破了一個PHP腳本成微小的塊,我可以最終得到了我所有的代碼運行。不過,我現在有一個腳本,它讀取一個巨大的CSV文件並將每行插入到MySQL數據庫中。每次我想更新我的網站時,不必經歷繁瑣的分割文件的過程,我只想讓這個腳本以我應該知道的方式工作。我的PHP腳本給我500內部服務器錯誤時,他們強烈
我已經得到它之前插入不同的網絡服務器上擁有超過10,000行,但也有至少7倍,在該文件中,它胡扯出來,它的完成之前。
所以,這個故事是,一個服務器上停止它應該之前,並在另一個它不運行在所有...它只是大約30秒後,一班班的方式,以一個500錯誤。
Apache的錯誤日誌給我的這些線,當腳本死亡:
[Tue Aug 23 13:09:04 2011] [warn] [client 71.168.85.72] mod_fcgid: read data timeout in 40 seconds
[Tue Aug 23 13:09:04 2011] [error] [client 71.168.85.72] Premature end of script headers: newcsvupdater.php
我有這兩條線在腳本的頂部到底:
set_time_limit(0);
ini_set('memory_limit','256M');
因爲以前我是有一個致命的內存分配錯誤,因爲顯然將大文件分割成數組是內存密集型的。
這裏插入代碼:
$file = "./bigdumbfile.csv"; // roughly 30mb
$handle = fopen($file, r);
$firstentry = 0;
while($csv = fgetcsv($handle))
{
if($firstentry == 0)
{
$firstentry++; // skips the top row of field names
}
else
{
// unimportant conditional code omitted
$checkforexisting = mysql_query("SELECT * FROM DB_TABLE WHERE ".
"id_one = '".$csv[0]."' AND id_two = '".$csv[2]."'");
$checknum = mysql_num_rows($checkforexisting);
if($checknum == 0)
{
if(!mysql_query("INSERT INTO DB_TABLE ".
"(id_one, data_one, id_two, data_two, ".
/* so on for 22 total fields */")
VALUES ('".addslashes($csv[0])."', '".
addslashes($csv[1])."', '".
addslashes($csv[2])."', '".
addslashes($csv[3])."' "/* ditto, as above */))
{
exit("<br>" . mysql_error());
}
else
{
print_r($csv);
echo " insert complete<br><br>";
}
}
}
}
echo "<br><b>DB_TABLE UPDATED";
我收到分裂,因爲這個大任務,我很厭倦了。我確信我做錯了很多,因爲我完全是自學成才,一般都會寫意大利麪條,所以不要猶豫。
如果您已經超過了40秒的超時時間,那麼您需要弄清楚爲什麼您的腳本太慢並且可能會做其他事情。我有一個導入大型mysql數據庫的腳本。我用它在3個小時內導入了一個10GB的數據庫。 – desbest