@stopkilling_dolphins

Очистка скрипта php при обработке изображений?

Здравствуйте, есть база данных на Maria DB, в которых хранятся картинки в поле с типом LONGBLOB. Знаю, что это есть зло, но отойти от этого пока нет возможности. Картинки весом примерно в 1 Мегабайт каждая.
Моя задача создать превьюху к каждой картинке, и чтобы она сохранялась в базу также, а не генерилась "на лету".
Набросал скрипт, который в принципе выполняет то, что нужно, но жор памяти огромен. На ~1600 записей отжирает около 2Гигабайт памяти. Сервер на apache локальный, так что, конечно, памяти можно ещё добавить, но если записей будет раз в десять больше? (а их будет).
Сам скрипт
<?php
include("bd.php");

    $query = "SELECT * FROM images"; //
    if (!$result = mysqli_query($con, $query)) {
		 exit(mysqli_error());
    }
	
    if(mysqli_num_rows($result) > 0) {
		$total = 0;
           while($row = mysqli_fetch_assoc($result)){

			$data = $row['content'];
			$guid = $row['guid'];
			$sort = $row['sort'];
			$image = imagecreatefromstring($data);
			$image = imagescale($image, 300);

			// start buffering
			ob_start();
			imagejpeg($image);
			$contents =  ob_get_contents();
			ob_end_clean();

			$contentsthumb = base64_encode($contents);
			$total++;
			$sqlin = "INSERT INTO images_thumb (guid, content, sort)
			VALUES ('$guid', '$contentsthumb', '$sort')";

				if (mysqli_query($con, $sqlin)) {
					// echo "New record created successfully";
				} else {
					echo "Error: " . $sqlin . "<br>" . mysqli_error($con);
				}


			imagedestroy($image);

			}
		mysqli_free_result($result);
		echo "Добавлено записей " . $total;
    }
	
	mysqli_close($con);


?>

Бегло загуглив, видел решения, при которых при достижении памяти определенного размера потребления, создается временный файлик с текущей позицией, скрипт останавливается, запускается снова с указанной позиции.
Это единственное решение или кто-то знает более оптимальный вариант?
  • Вопрос задан
  • 65 просмотров
Пригласить эксперта
Ответы на вопрос 1
Самым простым решением будет SQL_CALC_FOUND_ROWS + LIMIT, например, LIMIT 0 10 (c нулевой строки и получить 10), а дальше узнаете сколько там нашлось записей до лимита через запрос
SELECT FOUND_ROWS()
узнаем сколько там записей, хотя проще COUNT(*) получить, если вы тупо все записи хватаете без выборки по условияю (обработан или нет).

Смысл в том, что вы должны из базы брать например по 10 записей, обрабатывать, а потом следующие 10, например
LIMIT 10 10
LIMIT 20 10
LIMIT 30 10
небольшой пачкой брать по 10 записей, обрабатывать и потом следующие 10, зная сколько всего записей итерацию сделайте типа как постраничный вывод товаров, посмотрите как постраничная навигация делается на сайтах, так и делайте
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы