Czasami moja aplikacja musi czekać na coś. Na przykład, w przypadku buforowania: Jeśli obiekt nie zostanie znaleziony w pamięci podręcznej, skrypt ustawia specjalną wartość pod kluczem, symbolizując fakt, że jego wartość jest obecnie obliczona, a po zakończeniu zapisuje go. Jeśli w momencie obliczania inny klient żąda tego samego obiektu, skrypt nie przeliczył go, ale po prostu poczekam na pierwszą. Oczywiście jest to uproszczone wyjaśnienie. Nie wiem, jak to zrobić poprawnie, ale to zachowanie wydaje mi się być bardzo logiczne.

W procesie testowania zupełnie innej rzeczy, dziś wpadłem w problem.

<?php
echo time() . "\n";
sleep(10); // usleep() has the same effect
echo time() . "\n";

W ta sama sekunda otwórz tę stronę w przeglądarce w dwóch zakładkach i spodziewam się, że zobaczysz numery , ale ... zakładka, która została otwarta później, oprócz jego Opóźnienie, z jakiegoś powodu czeka na opóźnienie pierwszej karty (sformułowanie kulawy, ale rozumiesz mnie), więc widzę coś takiego: 1615749047 1615749057, 1615749047 1615749057. Jeśli dodasz więcej kart, każdy następny będzie czekać na wszystkie poprzednie.

Złamał mój mózg. To nie jest jak sobie wyobrażałem i był w tej złudze przez wiele lat. Nie udało mi się teraz znaleźć żadnych informacji. Przede wszystkim interesuje mnie, jak osiągnąć pożądany wynik. Dlaczego sen () zachowuje się w ten sposób, wydaje mi się, że zaczynam odgadnąć, ale będę zadowolony, jeśli udostępniasz pewne informacje. Dziękuję Ci!

Updatek . Wystarczy sprawdzić to: jeśli dodam header('Cache-Control: no-cache, no-store, must-revalidate'), a następnie nic dla mnie nie zmienia. Ale jeśli otworzę karty z różnych przeglądarek, nie ma problemu.

0
Bileslaw 14 marzec 2021, 23:05

1 odpowiedź

Najlepsza odpowiedź

Od czytania widzę dwa pytania

1. Jak blokuję drugą prośbę, podczas przetwarzania pierwszego?

Za to moja odpowiedź byłaby zamki. Dla PHP w szczególności polecam Symfony Blokada komponent. Sprawiasz, że oba żądania nabywają blokadę i wydają go tylko po zakończeniu, a pamięć podręczna zostanie wygenerowana.

2. Dlaczego 2 wnioski zwolnione w tym samym czasie czekają na siebie?

Domyślam się tutaj jest to, że Twoja przeglądarka ma kilka wbudowanych kolejkowania / buforowania lub tego wszystkiego. Możesz omówić to, otwierając tę samą stronę w różnych przeglądarkach, aby sprawdzić, czy to daje różne wyniki.

0
PtrTon 14 marzec 2021, 23:02