Laravel по-русски

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

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

#1 Re: Laravel 5.x » Утечка памяти после сохранения в базу данных (Eloquent) » 09.11.2017 18:45:44

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

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

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

Модель

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

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

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

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

#2 Laravel 5.x » Утечка памяти после сохранения в базу данных (Eloquent) » 05.11.2017 15:16:37

little_devil
Ответов: 2

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

#3 Re: Laravel 5.x » Валидация входящего json через встроянный валидатор » 03.08.2017 20:12:02

Спасибо, проверять в Request такое заранее оказалось действительно более удобно.

#4 Re: Laravel 5.x » Кастомная регистрация пользователей laravel 5.3 » 03.08.2017 14:57:45

Я считаю что вся проблема в том что вы используете напрямую bcrypt, laravel скорее всего использует "соль" при создании хеша пароля. Попробуйте использовать Hash::make($request->msPassword);

#5 Laravel 5.x » Валидация входящего json через встроянный валидатор » 03.08.2017 14:51:51

little_devil
Ответов: 2

Версия laravel: 5.4.30
php: 7.1.6

Мне приходит json в таком формате:

{
  "name":"example04.org.",
  "kind":"master",
  "nameservers":[
     "ns01.example04.org.",
     "ns03.example04.org."
  ]
}

В данный момент валидация происходит так:

        if (!$request->isJson())
            throw new RequestIsNotJson();

        $rules = config('ApiValidation.Domain.Create.rules');
        $messages = config('ApiValidation.Domain.Create.messages');

        $this->validate($request, $rules, $messages);

Правила валидации:

            'rules' => [
                'name' => [
                    'required',
                    'string',
                    "regex:/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\.$/",
                    'max:255'
                ],
                'kind' => [
                    'required',
                    'string',
                    'in:Master,Native,Slave',
                ],
                'nameservers' => [
                    'required',
                    'array',
                    'min:2'
                ],
                'nameservers.*' => [
                    "regex:/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])\.$/",
                ]
            ]

Необходимо проверить что нет лишних полей в корневом массиве. Т.е. на такой формат переданных данных:

{
  "name":"example04.org.",
  "kind":"master",
  "kindFake":"master",
  "nameservers":[
     "ns01.example04.org.",
     "ns03.example04.org."
  ]
}

Необходимо бросить исключение так как поле "kindFake" не разрешено.
Пробовал вариант:

'*' => [
'in_array:'=>'name,kind,nameservers'
]

Но он не сработал.

Какие ещё существуют варианты проверить на "лишние" переданные поля ?

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