Удаление блога и топиков

Подскажите, профи движка, я не могу понять как обстоит дело с нагрузкой.
Вот кусок код стандартного удаления всех топиков блога:
if(is_array($aTopicIds) and count($aTopicIds)) {
			/**
			 * Удаляем топики
			 */
			foreach ($aTopicIds as $iTopicId) {
				$this->Cache_Delete("topic_{$iTopicId}");
				if(Config::Get('db.tables.engine')=="InnoDB") {
					$this->Topic_DeleteTopicAdditionalData($iTopicId);
				} else {
					$this->Topic_DeleteTopic($iTopicId);
				}
			}

		}

Получается мы получаем список топиков и по одному вызываем команду удаления для каждого топика.
Я сейчас на базе этого примера написал скриптик под себя, но там нужно удалить несколько десятков топиков из блога. И тут возникла проблема, скрипт выполнялся 30 секунд.
Вот кусок скрипта:
foreach($topics_inc as $iTopicId=>$iYes) {
	if($iYes) {
		$this->Cache_Delete("topic_{$iTopicId}");
		if(Config::Get('db.tables.engine')=="InnoDB") {
			$this->Topic_DeleteTopicAdditionalData($iTopicId);
		} else {
			$this->Topic_DeleteTopic($iTopicId);
		}
	}
}

Получается есть некий массив содержащий ID топиков с идентификаторами, надо или нет удалять. Максимальное количество удаляемых топиков для скрипта 300 штук (исходя из поставленной задачи проекта).
Может ли проблема быть в том что не установлен sphinx(просто не в курсе все преимущества от этой штуки)?

7 комментариев

avatar
А часто ли нужно удалять столько топиков?
И чем Вас не устраивает 30 секунд?
Просто расширьте time_limit в PHP.
Конечно можно перенести удаление топиков в фоновый режим. То есть на сайте ставится: удалить топики. А скрипт по крону каждые 5 минут смотрит нужно ли удалять и если нужно, то удаляет. Тогда ещё бы было хорошо поставить sleep()/usleep(). Но это не обязательно.
А вообще время такое из-за того, что чистится всё связанное с топиком + кеш. 10 удалений в секунду это нормально, имхо.
avatar
Я если честно немного в шоке, от вашего ответа.
Смотрите, пример: удаление блога с топиками — стандартная задача для движка. Предположим что у нас в блоге 100000 топиков, тогда если посчитать математически получается удаление займет более трех часов.
Так это получается у всех такая скорость работы движка? Я думал это я что-то не так сделал…
Для моей задачи ставить удаление на cron не подходит. Тогда буду оптимизировать: одним запросом удаляю все топики из БД по ID… а в задания cron ставлю в очередь удаление кешей топиков…
Правильно мыслю?
avatar
Смотрите. Умение ходить — стандартная функция человека. Но вот незадача. Дойти до магазина мне 5 минут. Дойти до кинотеатра уже двадцать минут. Думаю логика понятна.
Если удаление кеша ставить в крон, то тоже не очень хорошо. В базе данных уже нет информации о топике, а в кеше он есть. Отсюдого могут появиться ошибки и неточности.
Если не можете ставить в крон, то удаляйте топики вручную, а когда их останется мало, то удаляйте сам блог. Но мне с трудом верится, что у Вас будет сто тысяч топиков. Причём в одном блоге. Да и при ста тысячах топиков у Вас другие проблемы появятся. Более серьёзные.
avatar
Давайте я Вам расскажу задачу которую делаю, чтобы было более понятно о чем я.
У каждого пользователя есть некие дополнительные данные: рост, вес,… около 300 штук.
При редактировании пользователь проставляет галочки напротив нужных пунктов.
Где галочка стоит, то там надо создать топик(если он не создан) в персональном блоге, например: «мой рост 180 см». И дальше пользователи могут комментировать это дело.
Если галочка не стоит, то нужно удалить старый топик (если он имеется).
Мне показалось самым логичным для этого использовать именно создание/удаление топиков.
Или можно это реализовать легче?
avatar
Я тут вижу такой выход из ситуации:
После того, как пользователь расставил галочки данные о галочках попадают в таблицу с временными данными. То есть просто id пользователя, имя галочки, 1 или 0 (поставлена галочка или нет), Можно использовать одну строку в таблице serialize(); массива.
Далее пользователю пишется: данные вступят в силу в течении пяти минут. Ну и на сервере просто по cron каждые 2-3 минуты запускается php скрипт, который смотрит есть ли не внесённые данные и если есть — создаёт топик.
Тут главное учитывать, если скрипт начал вносить данные и это заняло много времени чтобы этот же скрипт когда запустится через 2-3 минуты не продублировал данные.
avatar
Как вариант можно сделать еще так:
после сохранения провести пользователя по страницам которые удаляют по 50 топиков например:
Идет сохранение данных (10% завершено) (а фоново (Ajax) по очереди вызываются страницы вида /deletetopic/?ids=1,2,3,4,5,6,7,8,9… перечисление удаляемых id...50)
avatar
Можно ещё и так сделать, но если пользователь закроет страницу или у него оборвётся интернет, то задача будет выполнена не полностью.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.