Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.11.2017 15:16:37

Утечка памяти после сохранения в базу данных (Eloquent)

Laravel Framework 5.5.14
PHP 7.1.6

После сохранения данных в базу данных и очистки переменной в которой хранились эти данные происходит утечка памяти на размер самих данных.

К примеру у меня есть массив размером в 100 мегабайт (это 100 записей), я делаю мульти вставку и затем очищаю переменную в которой были эти данные, но память не возвращается. При этом если я очищаю переменную до вставки она возвращается.
Пробовал так же перезаписывать переменную результата не принесло.

В случае если принудительно вызывать gc_collect_cycles() и gc_mem_caches() примерно через 60 секунд происходит резкое падение используемой памяти на 100-500 мегабайт, но так как эта функция (CreateSnapshots) вызывается до 100 раз (а в некоторых случаях возможно и больше будет вызываться) получается такая ситуация что потребление ram доходит до 2-3 гигабайт.

	public function CreateSnapshots(): void {
		$this->ts3con = new TeamSpeak( $this->instance_id );

		$data = $this->GetAllServersSnapshots();
		
		if ( ! empty( $data ) ) {
			SnapshotsTeamspeakVirtualServers::insert( $data );
		}

		$this->ts3con->logout();
		unset( $this->ts3con, $data );
		gc_collect_cycles();
		gc_mem_caches();

		return;
	}

Какие существуют варианты побороть данный вид утечки памяти ?
laravel debugbar - полностью удален из проекта
DB::getQueryLog(); - ничего не возвращает (лог отключен), однако если его включить до вызова функции запросы логирует но при этом потребление памяти растет (дополнительно)
APP_DEBUG - установлен в значение false

Изменено little_devil (05.11.2017 15:19:32)

Не в сети

#2 09.11.2017 18:31:09

Cruide
Откуда: Домодедово, Моск. Обл.
Сообщений: 15
Сайт

Re: Утечка памяти после сохранения в базу данных (Eloquent)

А зачем return; в конце если это void да ещё конец метода?
Что такое SnapshotsTeamspeakVirtualServers? Модель?
Что такое new TeamSpeak( $this->instance_id )? Тоже модель?
Почему не

if( ($data = $this->GetAllServersSnapshots()) && is_array($data) )
{
    SnapshotsTeamspeakVirtualServers::create( $data );   
}


Много не понятного... нельзя просто взять и ответить почему небо синее...

Утечка может происходить из-за вновь создающегося объекта(ов) и хранящегося в памяти...
Типа
return self::$a[] = new Obj();

А данный метод может вообще не причём.

Изменено Cruide (09.11.2017 18:34:31)

Не в сети

#3 09.11.2017 18:45:44

Re: Утечка памяти после сохранения в базу данных (Eloquent)

А зачем return; в конце если это void да ещё конец метода?

Просто так поставил)

Что такое SnapshotsTeamspeakVirtualServers? Модель?

Модель

Почему не if( ($data = $this->GetAllServersSnapshots()) && is_array($data) ){    SnapshotsTeamspeakVirtualServers::create( $data );   }

Не додумался, спасибо)

Типа return self::$a[] = new Obj();

Такого в коде точно нет)

Изменено little_devil (09.11.2017 18:47:44)

Не в сети

Подвал раздела