0
为了使脚本与PHP 5.5一起工作,我实际上从mysql-extension改为PDO。使用mysql扩展它可以正常工作,但是使用PDO会导致内存溢出。PDO导致内存溢出
这里是我使用的功能:
protected function getData($table) {
global $db;
$insert = '';
$stmt = $db->query("-- " . __LINE__ . __FILE__ . "
SELECT *
FROM " . $table
);
if ($result = $stmt->fetchAll()) {
$insert_into = "INSERT INTO `" . $table . "` VALUES ". PHP_EOL;
$insert = "/*!40000 ALTER TABLE `" . $table . "` DISABLE KEYS */;" . PHP_EOL;
$insert .= $insert_into;
$countRow = 0;
$split_tmp = '';
foreach ($result as $row) {
$insert_tmp = "(";
foreach ($row as $data) {
if (!isset($data)) {
$insert_tmp .= 'NULL,';
} else if ($data != '') {
$insert_tmp .= "'" . addslashes($data) . "',";
} else {
$insert_tmp .= "'',";
}
}
$insert_tmp = rtrim($insert_tmp, ',') . '),' . PHP_EOL;
$insert .= $insert_tmp;
if ($this->querySplit) {
$split_tmp .= $insert_tmp;
if ($countRow > $this->maxRow && strlen($split_tmp) > $this->maxLength) {
$countRow = 0;
$split_tmp = '';
$insert = rtrim($insert, PHP_EOL . ',') . ';' . PHP_EOL;
$insert .= "/*!40000 ALTER TABLE `" . $table . "` ENABLE KEYS */;" . PHP_EOL . PHP_EOL;
$insert .= "/*!40000 ALTER TABLE `" . $table . "` DISABLE KEYS */;" . PHP_EOL;
$insert .= $insert_into;
}
}
$countRow ++;
}
$insert = rtrim($insert, PHP_EOL . ',') . ';' . PHP_EOL;
$insert .= "/*!40000 ALTER TABLE `" . $table . "` ENABLE KEYS */;" . PHP_EOL. PHP_EOL;
}
return $insert;
}
即使切换到
$db->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);
没有帮助。
memory_limit设置为256MB。
PDO不会造成内存溢出以下调整,您使用fetchall()的使用会导致内存溢出。一次取一行 – 2014-10-10 10:26:41
当您调用'fetchAll()'时,您的整个结果集将被缓冲到内存中。诀窍是让MySQL尽可能减少结果集的数量,例如'SELECT field1,field2'而不是'SELECT *',特别是如果表中有大量的列。如果你拉下50000行......那么你肯定能看到这个问题吗? 此外,你为什么要在一个短的函数中调用PHP_EOL 12次?你是通过命令行调用它还是导出它? – iamgory 2014-10-10 11:29:49
我需要所有的表字段,因为脚本要备份整个数据库。所以你的命名字段的解决方案不会改变任何东西。 – 2014-10-10 13:56:04