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