Я закончил писать свои сценарии php для проекта, который я делаю. Мой следующий шаг — я хотел бы посмотреть, смогу ли я улучшить свой код с точки зрения памяти, так как некоторые из моих сценариев потребляют много памяти. Я занимался исследованиями по этому вопросу, и одно из предложений — NULL и неустановленные переменные, но я никогда не видел пример этого. Поэтому я хотел привести пример общего действия, выполняемого в моих сценариях, и хотел знать, является ли это правильным способом сделать это:
$query = $dbconn->get_results("SELECT id,name FROM account WHERE active = 1");
if(isset($query))
{
foreach($query AS $currq)
{
$account_id = intval($currq->id);
$account_name = trim($currq->name);
//Code to stuff with this data
//NULL the variables before looping again
$account_id = NULL;
$account_name = NULL;
//Unset the variables before looping again
unset($account_id);
unset($account_name);
}
$query = NULL;
unset($query);
$currq = NULL;
unset($currq);
Это был бы правильный способ освободить память? Я читал, что сборка мусора в PHP может быть ленивой, поэтому они рекомендуют NULL значение, так как оно сразу его уменьшит.
Я знаю, что это может быть слишком расплывчато для этого сайта, но если кто-то может просто дать мне знать, является ли это правильным способом освобождения памяти? Или, если есть другой способ, приведите пример, чтобы я мог наглядно увидеть, как он работает. Заранее спасибо!
Пожалуйста, читайте дальше Генераторы PHP, именно для этого они и предназначены.
Вы не хотите извлекать все записи сразу, это проделает дыры в вашей памяти, как дробовик.
Вместо этого вы хотите получить ваши записи по одной за раз, обработать их, а затем получить следующую.
Вот пример:
function getAccountData(\PDO $pdo)
{
$stmt = $pdo->prepare("SELECT id,name FROM account WHERE active = 1");
$stmt->execute();
while ($row = $stmt->fetch()) {
yield $row;
}
}foreach (getAccountData($pdo) as $account){
//process the record for each iteration
//no need to unset anything
}
Хорошо, если функция $ dbconn-> get_results возвращает массив со всеми данными, тогда нет смысла использовать генераторы, так как память уже выделена для данных.
Вы также можете использовать функцию mysqli_fetch_assoc, чтобы получать по одной строке за раз. Он должен быть более эффективным, чем загрузка всех строк одновременно. http://php.net/manual/en/mysqli-result.fetch-assoc.php