我的php腳本停止運行,因爲它內存不足。 這裏是我的代碼:php mysql循環內存泄漏?
$files = array_diff(scandir($dir_name), array('..', '.'));
if (!empty($files))
{
foreach ($files as $file)
{
if (pathinfo($file, PATHINFO_EXTENSION) == "csv")
{
$fp = fopen($dir_name.$file, 'r');
while (($line = fgetcsv($fp, 0, $delimiter)) !== FALSE)
insert_update(array_map('addslashes', $line), $connect_id);
fclose($fp);
}
}
mysqli_close($connect_id);
}
我並運行該腳本喜歡上了同一個CSV(超過60萬行)的4倍。 使用完全相同的腳本,它會在不同的時刻停止... 停止之前完成的請求數:205 286 // 200 514 // 192 429 // 211 164 (我在每次嘗試之前截斷表)。 我總是使用相同的變量......如何使用內存可以增加? 它只是一個foreach循環......如果它的工作一次,它應該工作無限次,對吧?
謝謝,
Mickael。
PS:這裏是我的功能「INSERT_UPDATE」
function insert_update($row, $connect_id)
{
$table_name = "xxxxxxxx";
$maxcol = 42;
$my_request = "INSERT INTO $table_name VALUES ('$row[0]'";
$i = 1;
while ($i < $maxcol)
{
if (isset($row[$i]))
$my_request = $my_request.", '$row[$i]'";
else
$my_request = $my_request.", ''";
$i++;
}
$my_request = $my_request.")";
if (mysqli_query($connect_id, $my_request) == FALSE)
{
echo "<p>$my_request</p>";
exit();
}
}
你很容易受到[SQL注入攻擊(http://bobby-tables.com)。 'addslashes()'是完全沒用的垃圾,對保護你自己沒有用處。它是用絲網製成的避孕套 – 2014-10-09 14:35:18
是每次都以相同順序回來的文件嗎?如果不是,那麼應該解釋爲什麼這兩個不同的停止....也許只是增加內存可用,並繼續:) ini_set('memory_limit','256M'); – myte 2014-10-09 14:37:03
-MarcB好的但所有的CSV文件都是安全的。 -myte對於測試,我只是使用了一個csv,並且在每次測試後我都截斷了表格。其他任何關於如何在不同時刻停止的想法? 'memory_limit'被設置爲'-1'。 更重要的是,爲什麼它停下來的任何想法? – 2014-10-09 14:43:15