Задать вопрос
@Leopandro
Разработчик CRM/ERP систем

Почему не работает long polling?

Сделал первый скрипт с long polling, есть проблема - после lp запроса, сервер не отвечает на другие запросы пока не ответит на этот. Как исправить?
this.http.request('get', this.url).subscribe((data) => {
			alert(JSON.parse(data));
		}, error => {
			alert(error);
		});

public static function listenNotify(Request $request) {
		ignore_user_abort(false);
		set_time_limit(10);
		$id = Auth::user()->id;
		$limit = 0;
		while($limit < self::$timeout) {
			if ($notify = UserNotification::where([
				['user_id', '=', $id],
				['type', '=', 1],
				['notified', '=', 0]
			])->get()) {
				if (count($notify) > 0) {
					return response()->json($notify, 200);
				}
			}
			$limit++;
			sleep(1);
		}
		return response()->json([
			'timeout' => true
		], 200);
	}
  • Вопрос задан
  • 75 просмотров
Подписаться 1 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
search
@search
мама говорит что я особенный
Это происходит потому что PHP лочит сессию на каждом запросе. Это ставит в очередь другие ajax запросы. Для того чтоб освободить залоченную сессию можно выполнить

$request->session()->save();

где-нибудь перед while.

$request->session()->save() в недрах фреймворка вызывает session_write_close() что освобождает сессию и даёт дорогу другим запросам.

Вся эта колбасня с локами сессионных файлов нужна для того чтоб несколько запросов подряд не запоганили сессию. Если захотите что-нибудь записать в сессию после вызова $request->session()->save(), то, возможно прийдётся заново открывать сессию. Я хз, сделает ли ларавел это за вас или нет. На вашем месте советую убедиться самостоятельно, чтоб потом с бубном не плясать.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы