Как PHP PDO работает внутри? - PullRequest
10 голосов
/ 27 марта 2010

Я хочу использовать pdo в своем приложении, но до этого я хочу понять, как внутренне PDOStatement->fetch и PDOStatement->fetchAll.

Для моего приложения я хочу сделать что-то вроде «SELECT * FROM myTable» и вставить в файл csv, который содержит около 90000 строк данных.

У меня вопрос, если я использую PDOStatement->fetch, как я использую его здесь:

// First, prepare the statement, using placeholders
$query = "SELECT * FROM tableName";
$stmt = $this->connection->prepare($query);

// Execute the statement
$stmt->execute();
var_dump($stmt->fetch(PDO::FETCH_ASSOC));

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) 
{
echo "Hi";
// Export every row to a file
fputcsv($data, $row);
}

Будет ли результат после каждой выборки из базы данных сохраняться в памяти?

То есть, когда я делаю вторую выборку, память будет иметь данные первой выборки, а также данные для второй выборки.

И так, если у меня 90000 строк данных и каждый раз выполняется выборка, то память обновляется, чтобы получить новый результат выборки, не удаляя результаты из предыдущей выборки, и поэтому для памяти последней выборки уже будет 89999 строк данных.

  1. Это как PDOStatement::fetch работает?
  2. Производительность мудро, как этот стек против PDOStatement::fetchAll?

Обновление: кое-что о fetch и fetchAll с точки зрения использования памяти

Просто хотел добавить кое-что к этому вопросу, так как недавно нашел что-то, касающееся fetch и fetch. Все, надеюсь, это сделает этот вопрос полезным, чтобы люди могли посетить этот вопрос в будущем, чтобы получить некоторое представление о параметрах fetch и fetchAll.

fetch не хранит информацию в памяти и работает от строки к строке, поэтому он проходит через набор результатов и возвращает строку 1, затем снова возвращается к набору результатов и затем снова возвращает строку 2, помня, что она не вернет строку 1, а также 2, но вернет только строку 2, поэтому fetch не сохранит ничего в памяти, но fetchAll сохранит детали в памяти. Так что fetch - лучший вариант по сравнению с fetchAll, если мы имеем дело с результирующим набором размером около 100K.

Ответы [ 2 ]

3 голосов
/ 27 марта 2010

PHP обычно хранит свои результаты на сервере. Все зависит от водителя. MySQL можно использовать в «небуферизованном» режиме, но это немного сложнее в использовании. fetchAll() на большом наборе результатов может вызвать переполнение сети, исчерпание памяти и т. Д.

В каждом случае, когда мне нужно обработать более 1000 строк, я не использую PHP. Также обратите внимание, если в вашей базе данных уже есть операция экспорта в CSV. Многие делают.

0 голосов
/ 15 октября 2012

Я советую вам использовать PDO::FETCH_LAZY вместо PDO::FETCH_ASSOC для больших данных. Я использовал его для экспорта в CSV строка за строкой, и он отлично работает. Без ошибок «недостаточно памяти».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...