fsockopen - czasami nawiązywanie się wydłuża do 5-20 sekund

0

Dzień dobry.
Mam problem z funkcją **fsockopen **lub z **php **lub z serwerem **apache **lub jeszcze z czymś innym.
Nie mam zielonego pojęcia w czym rzecz.

Mam kolejkę, do której dodawanych jest 100 serwerów api do odpytania na danym porcie (nie http). Gdy nawiązanie połączenia ma normalny czas (w milisekundach) - wszystko jest ok. Jednak zauważyłem, że losowo nawiązywanie połączenia z niektórymi serwerami trwa znacznie dłużej. Z moich obserwacji wynika, że często jest to 5, 10, 15, 20 sekund (wraz z milisekundami).

To nie problem z serwerami api. Gdy odpytuje je ręcznie (bez kolejki) - ten problem nie występuje.

Stworzyłem sobie też 2 kolumny w bazie, gdzie oprócz statystyk z odpytanych serwerów zapisuję też czas fsockopen oraz stream_get_contents.
Z stream_get_contents nigdy nie ma problemu. Jeśli już wydłuża się się czas to zawsze w fsockopen.

To fragment mojego kodu:

$connectionTimeStart = microtime(true); 

		// Open connection
		$socket = @fsockopen($this->host, $this->port, $errno, $errstr, 1);

		$connectionTimeEnd = microtime(true);
		$this->connectionTime = ($connectionTimeEnd - $connectionTimeStart);

		if (!$socket) {
			return false;
		}

		$streamTimeStart = microtime(true); 

		// Get server info
		fwrite(<moje zapytanie>);
		stream_set_timeout($socket, 1);
		$response = stream_get_contents($socket);

		$streamTimeEnd = microtime(true);
		$this->streamTime = ($streamTimeEnd - $streamTimeStart);

		$info = stream_get_meta_data($socket);
		fclose($socket);

		if ($info['timed_out']) {
			$this->timeout = true;
			return false;
		}

A to screen z mojej bazy z czasem w skeundach po jakim zostało nawiązane połączenie. Jeśli w kolumnie stream_time jest null to znaczy, że serwer jest offline. I wtedy connection_time wynosi ok 1 sekundy (timeout). Co ciekawe - na przedostatnim rekordzie można zauważyć, że odpytywany serwer jest offline, a czas nawiązywania połączenia to 6 sekund. Jednak Skoro mam ustawiony timeout na 1 sekundę, to skąd się bierze te 5 sekund jeszcze? Dla mnie to wygląda, jakby mój serwer, apache, php, laravel, nie wiem co dostawał jakiejś zadyszki lub czekał z połączeniem (za dużo połączeń na raz?).. Ale przeciążenie serwera odpada - moje procesy zajmują max 20% w szczytowych momentach. Ramu też nie brakuje.

Wersja php: PHP 8.0.0
Wersja Laravel: v8.21.0
Wersja Apache2: 2.4.38

1

Sprawdź wykorzystywane przez Ciebie serwery DNS - lookup domeny nie jest wliczany w timeout połączenia.

0

To jeszcze..
Mam domenę w OVH i korzystam z ich standardowych serwerów DNS (ns200.anycast.me i dns200.anycast.me). I co mogę tutaj zrobić, żeby wyeliminować to opóźnienie? Zmienić je na inne czy jakoś może coś z tymi "pozmieniać"? Nie bardzo się znam na tym.

Widzę też drugą opcję - w bazie przechowuję też adresy ip serwerów. Może po prostu będę odpytywał każdy serwer po ip. Tylko tu nasuwa mi się myśl - czy połączenia przez ip na dany port też można zablokować? Tak jak w apache można zablokować dostęp przez ip.

1

co mogę tutaj zrobić, żeby wyeliminować to opóźnienie? Zmienić je na inne czy jakoś może coś z tymi "pozmieniać"?

Jeśli nie wykorzystujesz ficzerów unikalnych dla DNSów OVH (o ile w ogóle jakieś takie ficzery istnieją), to najwygodniej będzie zmienić konfigurację po Twojej stronie i przerzucić się na 1.1.1.1 czy 8.8.8.8.

czy połączenia przez ip na dany port też można zablokować?

Niestety nie rozumiem pytania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1